From 45fa366cfc20f729b85cf8291e1948196410e59d Mon Sep 17 00:00:00 2001 From: Elie Gambache Date: Sat, 24 Jan 2026 23:54:26 +0200 Subject: [PATCH] fix: use base_text_order for commentary book ordering Sefaria's table_of_contents.json doesn't provide an 'order' field for commentary books. Instead, it provides 'base_text_order' which indicates the order of the base text being commented on. Changes: - Parse base_text_order as fallback when order is not available - Look up book order by Hebrew title in addition to English title This fixes the issue where most commentary books had orderIndex=999. Closes kdroidFilter/Zayit#263 --- .../seforimlibrary/sefariasqlite/SefariaDirectImporter.kt | 4 +++- .../seforimlibrary/sefariasqlite/SefariaImportOrdering.kt | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/generator/sefariasqlite/src/jvmMain/kotlin/io/github/kdroidfilter/seforimlibrary/sefariasqlite/SefariaDirectImporter.kt b/generator/sefariasqlite/src/jvmMain/kotlin/io/github/kdroidfilter/seforimlibrary/sefariasqlite/SefariaDirectImporter.kt index 785f142..c579b4a 100644 --- a/generator/sefariasqlite/src/jvmMain/kotlin/io/github/kdroidfilter/seforimlibrary/sefariasqlite/SefariaDirectImporter.kt +++ b/generator/sefariasqlite/src/jvmMain/kotlin/io/github/kdroidfilter/seforimlibrary/sefariasqlite/SefariaDirectImporter.kt @@ -162,7 +162,9 @@ class SefariaDirectImporter( val catId = ensureCategoryPath(payload.categoriesHe) val bookId = nextBookId.getAndIncrement() val bookPath = buildBookPath(payload.categoriesHe, payload.heTitle) - val bookOrder = bookOrders[payload.enTitle]?.toFloat() ?: 999f + val bookOrder = (bookOrders[payload.enTitle] + ?: bookOrders[payload.heTitle] + ?: bookOrders[sanitizeFolder(payload.heTitle)])?.toFloat() ?: 999f val normalizedPath = normalizedBookPath(payload.categoriesHe, payload.heTitle) val isBaseBook = normalizedPath in baseBookKeys diff --git a/generator/sefariasqlite/src/jvmMain/kotlin/io/github/kdroidfilter/seforimlibrary/sefariasqlite/SefariaImportOrdering.kt b/generator/sefariasqlite/src/jvmMain/kotlin/io/github/kdroidfilter/seforimlibrary/sefariasqlite/SefariaImportOrdering.kt index 93effb5..bfbdbcc 100644 --- a/generator/sefariasqlite/src/jvmMain/kotlin/io/github/kdroidfilter/seforimlibrary/sefariasqlite/SefariaImportOrdering.kt +++ b/generator/sefariasqlite/src/jvmMain/kotlin/io/github/kdroidfilter/seforimlibrary/sefariasqlite/SefariaImportOrdering.kt @@ -4,6 +4,7 @@ import co.touchlab.kermit.Logger import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.contentOrNull +import kotlinx.serialization.json.doubleOrNull import kotlinx.serialization.json.intOrNull import kotlinx.serialization.json.jsonArray import kotlinx.serialization.json.jsonObject @@ -38,7 +39,10 @@ internal fun parseTableOfContentsOrders( fun processTocItem(item: JsonObject, categoryPath: List = emptyList()) { val title = item["title"]?.jsonPrimitive?.contentOrNull val heTitle = item["heTitle"]?.jsonPrimitive?.contentOrNull + // Use order if available, otherwise fall back to base_text_order (for commentaries) val order = item["order"]?.jsonPrimitive?.intOrNull + ?: item["base_text_order"]?.jsonPrimitive?.intOrNull + ?: item["base_text_order"]?.jsonPrimitive?.doubleOrNull?.toInt() if (title != null && order != null) { bookOrders[title] = order }