From cfc67797e245b7aacc03f3db4aec030fd985ad47 Mon Sep 17 00:00:00 2001 From: Benedikt McMullin Date: Sun, 1 Jun 2025 20:03:24 +0200 Subject: [PATCH] css_tweaks: add generic setting for smaller inpage footnotes (#13613) Replaces the 3 '... (smaller)' tweaks. --- frontend/ui/data/css_tweaks.lua | 111 +++++------------------- frontend/ui/data/onetime_migration.lua | 23 ++--- frontend/ui/data/settings_migration.lua | 56 ++++++++++++ 3 files changed, 91 insertions(+), 99 deletions(-) diff --git a/frontend/ui/data/css_tweaks.lua b/frontend/ui/data/css_tweaks.lua index 22e1edaf5..bd15ad9a1 100644 --- a/frontend/ui/data/css_tweaks.lua +++ b/frontend/ui/data/css_tweaks.lua @@ -24,8 +24,9 @@ local T = require("ffi/util").template -- Default globally enabled style tweaks, for new installations local DEFAULT_GLOBAL_STYLE_TWEAKS = {} -- Display in-page per-specs footnotes for EPUB and FB2: -DEFAULT_GLOBAL_STYLE_TWEAKS["footnote-inpage_epub_smaller"] = true +DEFAULT_GLOBAL_STYLE_TWEAKS["footnote-inpage_epub"] = true DEFAULT_GLOBAL_STYLE_TWEAKS["footnote-inpage_fb2"] = true +DEFAULT_GLOBAL_STYLE_TWEAKS["inpage_footnote_font-size_smaller"] = true local CssTweaks = { DEFAULT_GLOBAL_STYLE_TWEAKS = DEFAULT_GLOBAL_STYLE_TWEAKS, @@ -898,7 +899,7 @@ body[name="comments"] > section { id = "footnote-inpage_epub", conflicts_with = function(id) return util.stringStartsWith(id, "footnote-inpage_") end, - global_conflicts_with = function(id) return util.stringStartsWith(id, "footnote-inpage_epub") end, + global_conflicts_with = false, title = _("In-page EPUB footnotes"), description = _([[ Show EPUB footnote text at the bottom of pages that contain links to them. @@ -920,43 +921,10 @@ This only works with footnotes that have specific attributes set by the publishe } ]], }, - { - id = "footnote-inpage_epub_smaller", - conflicts_with = function(id) return util.stringStartsWith(id, "footnote-inpage_") end, - global_conflicts_with = function(id) return util.stringStartsWith(id, "footnote-inpage_epub") end, - title = _("In-page EPUB footnotes (smaller)"), - description = _([[ -Show EPUB footnote text at the bottom of pages that contain links to them. -This only works with footnotes that have specific attributes set by the publisher.]]), - -- Restrict this to non-FB2 documents, as FB2 can have - -- and we don't want to have them smaller - css = [[ -*[type~="note"], -*[type~="endnote"], -*[type~="footnote"], -*[type~="rearnote"], -*[role~="doc-note"], -*[role~="doc-endnote"], -*[role~="doc-footnote"], -*[role~="doc-rearnote"] -{ - -cr-only-if: -fb2-document; - -cr-hint: footnote-inpage; - margin: 0 !important; -} -/* Also applies to extended footnotes */ -*, autoBoxing { - -cr-hint: late; - -cr-only-if: inpage-footnote; - font-size: 0.8rem !important; -} - ]], - separator = true, - }, { id = "footnote-inpage_wikipedia", conflicts_with = function(id) return util.stringStartsWith(id, "footnote-inpage_") end, - global_conflicts_with = function(id) return util.stringStartsWith(id, "footnote-inpage_wikipedia") end, + global_conflicts_with = false, title = _("In-page Wikipedia footnotes"), description = _([[Show footnotes at the bottom of pages in Wikipedia EPUBs.]]), css = [[ @@ -970,37 +938,13 @@ ol.references > li > .noprint { display: none; } ol.references > li > .mw-cite-backlink { display: none; } ]], }, - { - id = "footnote-inpage_wikipedia_smaller", - conflicts_with = function(id) return util.stringStartsWith(id, "footnote-inpage_") end, - global_conflicts_with = function(id) return util.stringStartsWith(id, "footnote-inpage_wikipedia") end, - title = _("In-page Wikipedia footnotes (smaller)"), - description = _([[Show footnotes at the bottom of pages in Wikipedia EPUBs.]]), - css = [[ -ol.references > li { - -cr-hint: footnote-inpage; - list-style-position: -cr-outside; - margin: 0 !important; -} -/* Also applies to extended footnotes */ -*, autoBoxing { - -cr-hint: late; - -cr-only-if: inpage-footnote; - font-size: 0.8rem !important; -} -/* hide backlinks */ -ol.references > li > .noprint { display: none; } -ol.references > li > .mw-cite-backlink { display: none; } - ]], - separator = true, - }, - -- We can add other classic classnames to the 2 following - -- tweaks (except when named 'calibreN', as the N number is + -- We can add other classic classnames to the following + -- tweak (except when named 'calibreN', as the N number is -- usually random across books). { id = "footnote-inpage_classic_classnames", conflicts_with = function(id) return util.stringStartsWith(id, "footnote-inpage_") end, - global_conflicts_with = function(id) return util.stringStartsWith(id, "footnote-inpage_classic_classnames") end, + global_conflicts_with = false, title = _("In-page classic classname footnotes"), description = _([[ Show footnotes with classic classnames at the bottom of pages. @@ -1016,32 +960,6 @@ This tweak can be duplicated as a user style tweak when books contain footnotes { -cr-hint: footnote-inpage; margin: 0 !important; -} - ]], - }, - { - id = "footnote-inpage_classic_classnames_smaller", - conflicts_with = function(id) return util.stringStartsWith(id, "footnote-inpage_") end, - global_conflicts_with = function(id) return util.stringStartsWith(id, "footnote-inpage_classic_classnames") end, - title = _("In-page classic classname footnotes (smaller)"), - description = _([[ -Show footnotes with classic classnames at the bottom of pages. -This tweak can be duplicated as a user style tweak when books contain footnotes wrapped with other class names.]]), - css = [[ -.footnote, .footnotes, .fn, -.note, .note1, .note2, .note3, -.ntb, .ntb-txt, .ntb-txt-j, -.przypis, .przypis1, /* Polish footnotes */ -.voetnoten /* Dutch footnotes */ -{ - -cr-hint: footnote-inpage; - margin: 0 !important; -} -/* Also applies to extended footnotes */ -*, autoBoxing { - -cr-hint: late; - -cr-only-if: inpage-footnote; - font-size: 0.8rem !important; } ]], separator = true, @@ -1102,6 +1020,21 @@ This tweak can be duplicated as a user style tweak when a book contains other el (function() local sub_table = { title = _("In-page footnote font size"), + { + id = "inpage_footnote_font-size_smaller", + conflicts_with = function(id) return util.stringStartsWith(id, "inpage_footnote_font-size_") end, + title = _("Smaller footnotes (80%, legacy)"), + description = _([[ +Decrease size of in-page footnotes. This may have no effect if it's overwritten by publisher styles. The "footnote font size" style tweaks are recommended instead.]]), + css = [[ +*, autoBoxing { + -cr-hint: late; + -cr-only-if: -fb2-document inpage-footnote; + font-size: 0.8rem !important; +} + ]], + separator = true, + }, } for __, rem in ipairs( { 1.0, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65 } ) do local pct = rem * 100 diff --git a/frontend/ui/data/onetime_migration.lua b/frontend/ui/data/onetime_migration.lua index 01958ec64..84fc9a144 100644 --- a/frontend/ui/data/onetime_migration.lua +++ b/frontend/ui/data/onetime_migration.lua @@ -12,7 +12,7 @@ local util = require("util") local _ = require("gettext") -- Date at which the last migration snippet was added -local CURRENT_MIGRATION_DATE = 20250405 +local CURRENT_MIGRATION_DATE = 20250601 -- Retrieve the date of the previous migration, if any local last_migration_date = G_reader_settings:readSetting("last_migration_date", 0) @@ -34,15 +34,6 @@ local function drop_fontcache() end end --- Global settings, https://github.com/koreader/koreader/pull/4945 & https://github.com/koreader/koreader/pull/5655 --- Limit the check to the most recent update. ReaderUI calls this one unconditionally to update docsettings, too. -if last_migration_date < 20191129 then - logger.info("Performing one-time migration for 20191129") - - local SettingsMigration = require("ui/data/settings_migration") - SettingsMigration:migrateSettings(G_reader_settings) -end - -- ReaderTypography, https://github.com/koreader/koreader/pull/6072 if last_migration_date < 20200421 then logger.info("Performing one-time migration for 20200421") @@ -886,5 +877,17 @@ if last_migration_date < 20250405 then G_reader_settings:delSetting("show_finished") end +-- Global settings, https://github.com/koreader/koreader/pull/4945 & https://github.com/koreader/koreader/pull/5655 +-- Limit the check to the most recent update. ReaderUI calls this one unconditionally to update docsettings, too. +-- 20250601, Refactor default footnote style tweaks +-- https://github.com/koreader/koreader/pull/13613 +if last_migration_date < 20250601 then + logger.info("Performing one-time migration for 20250601") + + local SettingsMigration = require("ui/data/settings_migration") + SettingsMigration:migrateSettings(G_reader_settings) +end + + -- We're done, store the current migration date G_reader_settings:saveSetting("last_migration_date", CURRENT_MIGRATION_DATE) diff --git a/frontend/ui/data/settings_migration.lua b/frontend/ui/data/settings_migration.lua index 88130bafc..f570a42a4 100644 --- a/frontend/ui/data/settings_migration.lua +++ b/frontend/ui/data/settings_migration.lua @@ -45,6 +45,62 @@ function SettingsMigration:migrateSettings(config) config:saveSetting("copt_word_spacing", { 100, space_condensing }) end + if config:has("style_tweaks") then + local tweaks = config:readSetting("style_tweaks") + if tweaks then + -- try to preserve user intent when flattening the previous combination of + -- ["footnote-inpage_x", "footnote-inpage_x_smaller"] into ["footnote-inpage_x"] + -- + -- | x_smaller | + -- | nil | true | false | + -- -----------+-------+-------+-------+ + -- nil | nil | true | false | + -- x true | true | true | true | + -- false | false | true | false | + -- -----------+-----------------------+ + -- + -- If either tweak is true, enable the base tweak to keep that type of footnote. + -- (Preserving small vs normal size is handled below) + -- If one was false and the other nil or also false, we had a default + -- that was disabled for the current book and want to keep it false. + -- If both are nil they were both disabled (global settings) or both using their + -- respective default values (book settings) and we keep it as nil + + if tweaks["footnote-inpage_epub"] or tweaks["footnote-inpage_epub_smaller"] then + tweaks["footnote-inpage_epub"] = true + elseif tweaks["footnote-inpage_epub"] == false or tweaks["footnote-inpage_epub_smaller"] == false then + tweaks["footnote-inpage_epub"] = false + end + if tweaks["footnote-inpage_wikipedia"] or tweaks["footnote-inpage_wikipedia_smaller"] then + tweaks["footnote-inpage_wikipedia"] = true + elseif tweaks["footnote-inpage_wikipedia"] == false or tweaks["footnote-inpage_wikipedia_smaller"] == false then + tweaks["footnote-inpage_wikipedia"] = false + end + if tweaks["footnote-inpage_classic_classnames"] or tweaks["footnote-inpage_classic_classnames_smaller"] then + tweaks["footnote-inpage_classic_classnames"] = true + elseif tweaks["footnote-inpage_classic_classnames"] == false or tweaks["footnote-inpage_classic_classnames_smaller"] == false then + tweaks["footnote-inpage_classic_classnames"] = false + end + + local forced_size = false + for __, pct in ipairs( { 100, 90, 85, 80, 75, 70, 65 } ) do + if tweaks["inpage_footnote_font-size_" .. pct] then + forced_size = true + end + end + if not forced_size + and (tweaks["footnote-inpage_epub_smaller"] + or tweaks["footnote-inpage_wikipedia_smaller"] + or tweaks["footnote-inpage_classic_classnames_smaller"] + ) then + tweaks["inpage_footnote_font-size_smaller"] = true + end + + tweaks["footnote-inpage_epub_smaller"] = nil + tweaks["footnote-inpage_wikipedia_smaller"] = nil + tweaks["footnote-inpage_classic_classnames_smaller"] = nil + end + end end return SettingsMigration