Leseposition: Buchansicht und Lesemodus teilen einen Stand, nie rückwärts

- Lesemodus-Schlüssel (03-4:0) wurden in der Buchansicht nicht erkannt.
- Es gilt immer die weiter hinten liegende Stelle beider Ansichten.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
team3
2026-10-09 18:03:42 +02:00
parent 7b60b20856
commit 9945b20469
2 changed files with 18 additions and 11 deletions

View File

@@ -21,15 +21,22 @@ function idVonNr(nr) {
}
// Lesemodus-Schlüssel (vorwort, k3, a03-4:2, ende) → Element-ID der Buchansicht, wenn zuletzt dort gelesen wurde
function idVonLesemodus(pos) {
if (pos.zuletzt !== 'lesen' || !pos.lesemodus || !daten.value) return ''
if (!pos.lesemodus || !daten.value) return ''
const m = pos.lesemodus
if (m === 'vorwort') return 'vorwort'
const kap = /^k(\d+)$/.exec(m)
if (kap) return 'k' + (daten.value.kapitel[Number(kap[1]) - 1]?.id || '')
const abs = /^(a[\d-]+):/.exec(m)
if (abs) return abs[1]
const abs = /^a?([\d-]+):/.exec(m)
if (abs) return 'a' + abs[1]
return ''
}
// Von zwei Element-IDs die, die im Buch weiter hinten liegt (Dokumentreihenfolge)
function spaetere(a, b) {
const ea = a && document.getElementById(a), eb = b && document.getElementById(b)
if (!ea) return eb ? b : ''
if (!eb) return a
return ea.compareDocumentPosition(eb) & Node.DOCUMENT_POSITION_FOLLOWING ? b : a
}
function nrVonId(id) {
if (!id || !daten.value) return ''
if (id === 'vorwort') return 'vorwort'
@@ -88,7 +95,7 @@ async function laden() {
await nextTick()
spy()
// Gemerkte Position hat Vorrang (die Adresse spiegelt nur den letzten Scrollstand); zuletzt im Lesemodus gelesen → dessen Stelle
const ziel = idVonLesemodus(pos) || pos.abschnitt || idVonNr(props.nr)
const ziel = spaetere(idVonLesemodus(pos), pos.abschnitt) || idVonNr(props.nr)
// Der Sprung beim Laden darf die gemerkte Position nicht überschreiben; erst eigenes Scrollen zählt wieder
ruhe = true
clearTimeout(ruheTimer)

View File

@@ -84,14 +84,14 @@ onMounted(async () => {
window.addEventListener('keydown', taste)
const p = await api.position(props.slug, props.version).catch(() => ({}))
const merk = p.lesemodus
// Zuletzt in der Buchansicht gelesen → beim passenden Abschnitt bzw. Kapitel beginnen
let i = -1
if (p.zuletzt === 'buch' && p.abschnitt) {
const a = p.abschnitt
i = screens.value.findIndex((s) => s.key === a || s.key.startsWith(a + ':') || (s.typ === 'kapitel' && 'k' + s.kap.id === a))
}
// Alte Positionen waren ein Index, neue sind ein key.
if (i < 0) i = typeof merk === 'string' ? screens.value.findIndex((s) => s.key === merk) : Number(merk || 0)
let i = typeof merk === 'string' ? screens.value.findIndex((s) => s.key === merk) : Number(merk || 0)
// Beide Ansichten teilen einen Stand: Liegt die Stelle der Buchansicht weiter hinten, gilt sie; nie zurück.
if (p.abschnitt) {
const a = p.abschnitt.replace(/^a/, '')
const j = screens.value.findIndex((s) => s.key === p.abschnitt || s.key.startsWith(a + ':') || (s.typ === 'kapitel' && 'k' + s.kap.id === p.abschnitt))
if (j > i) i = j
}
pos.value = Math.min(Math.max(i, 0), screens.value.length - 1)
})
onUnmounted(() => window.removeEventListener('keydown', taste))