diff --git a/README.md b/README.md index de7a143..5929728 100644 --- a/README.md +++ b/README.md @@ -244,6 +244,18 @@ document.addEventListener("on_update_available", (event) => { }); ``` +Непосредственно перед заменой содержимого при переходе между страницами отправляется всплывающее событие `on_page_change`. В `page` находится полная запись целевой страницы из manifest, а в `previousPage` — предыдущая страница или `null` при первом рендере: + +```javascript +document.addEventListener("on_page_change", (event) => { + const { page, previousPage, number, title, index } = event.detail; + console.log(`${previousPage?.number ?? "—"} → ${number}: ${title}`, { + page, + index, + }); +}); +``` + Код из `custom_js` считается доверенным и выполняется в контексте страницы. Изменение системного или пользовательского CSS/JS меняет `revision`, поэтому обновлённый runtime сохраняется в IndexedDB и применяется после перезагрузки клиента. Версия библиотеки, которой был скомпилирован физический `index.html`, доступна пользовательскому JavaScript в глобальной строковой переменной: diff --git a/docslib/_version.py b/docslib/_version.py index b443f7d..c3c006f 100644 --- a/docslib/_version.py +++ b/docslib/_version.py @@ -1,3 +1,3 @@ """Single source of truth for the SharedDocsLib package version.""" -__version__ = "0.4.3" +__version__ = "0.4.4" diff --git a/docslib/templates/client.js b/docslib/templates/client.js index 2e4202b..fe16c24 100644 --- a/docslib/templates/client.js +++ b/docslib/templates/client.js @@ -358,6 +358,17 @@ } function applyPage(page, index) { + const previousPage = manifest.pages.find((candidate) => candidate.number === currentNumber) || null; + document.dispatchEvent(new CustomEvent("on_page_change", { + bubbles: true, + detail: { + page, + previousPage, + number: page.number, + title: page.title, + index, + }, + })); currentNumber = page.number; if (routeNumber() !== page.number) history.replaceState(null, "", `#/page/${encodeURIComponent(page.number)}`); document.title = `${page.title} · ${manifest.title}`; diff --git a/tests/test_server.py b/tests/test_server.py index 89faeee..e0d0690 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -97,7 +97,7 @@ def test_all_endpoints_and_self_contained_build(tmp_path): assert html_response.status_code == 200 assert "http://127.0.0.1:9000/manifest.json" in html assert "http://127.0.0.1:9000/version" in html - assert 'globalThis.COMPILED_FROM_VERSION = "0.4.3";' in html + assert 'globalThis.COMPILED_FROM_VERSION = "0.4.4";' in html assert ".content { --custom-test: yes; }" in html assert r'document.body.dataset.customTest = \"yes\";' in html assert 'id="docslib-loading"' in html @@ -116,6 +116,12 @@ def test_all_endpoints_and_self_contained_build(tmp_path): assert "cached," in system_js assert "applied: false" in system_js assert 'new CustomEvent("on_update_available"' in system_js + assert 'new CustomEvent("on_page_change"' in system_js + assert "page," in system_js + assert "previousPage," in system_js + assert "number: page.number" in system_js + assert "title: page.title" in system_js + assert system_js.index('new CustomEvent("on_page_change"') < system_js.index("currentNumber = page.number") assert "currentRevision: lastSyncedRevision" in system_js assert 'config.versionUrl || siblingResourceUrl(config.manifestUrl, "version")' in system_js assert 'target.searchParams.set(' in system_js @@ -242,7 +248,7 @@ def test_all_endpoints_and_self_contained_build(tmp_path): def test_build_writes_static_bundle(tmp_path): - assert __version__ == "0.4.3" + assert __version__ == "0.4.4" @Page("1", "Static page") def static_page():