From 8dc92384a6f731ed30fb971422df5a662826418d Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 3 Jul 2024 09:31:43 +0200 Subject: [PATCH 01/61] Add navigators/web module --- readium/navigators/web/build.gradle.kts | 20 +++++++++++++++++++ readium/navigators/web/gradle.properties | 1 + .../web/src/main/AndroidManifest.xml | 2 ++ settings.gradle.kts | 4 ++++ 4 files changed, 27 insertions(+) create mode 100644 readium/navigators/web/build.gradle.kts create mode 100644 readium/navigators/web/gradle.properties create mode 100644 readium/navigators/web/src/main/AndroidManifest.xml diff --git a/readium/navigators/web/build.gradle.kts b/readium/navigators/web/build.gradle.kts new file mode 100644 index 0000000000..f930a2f4d8 --- /dev/null +++ b/readium/navigators/web/build.gradle.kts @@ -0,0 +1,20 @@ +/* + * Copyright 2022 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +plugins { + id("readium.library-conventions") +} + +android { + namespace = "org.readium.navigators.web" +} + +dependencies { + api(project(":readium:readium-shared")) + + implementation(libs.timber) + implementation(libs.kotlinx.coroutines.android) +} diff --git a/readium/navigators/web/gradle.properties b/readium/navigators/web/gradle.properties new file mode 100644 index 0000000000..d695de80f0 --- /dev/null +++ b/readium/navigators/web/gradle.properties @@ -0,0 +1 @@ +pom.artifactId=readium-navigator-web diff --git a/readium/navigators/web/src/main/AndroidManifest.xml b/readium/navigators/web/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..8072ee00db --- /dev/null +++ b/readium/navigators/web/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/settings.gradle.kts b/settings.gradle.kts index e7220de428..2f45647ca0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -42,6 +42,10 @@ include(":readium:navigator") project(":readium:navigator") .name = "readium-navigator" +include(":readium:navigators:web") +project(":readium:navigators:web") + .name = "readium-navigator-web" + include(":readium:navigators:media:common") project(":readium:navigators:media:common") .name = "readium-navigator-media-common" From ba0fc5c161e0aa3ac6cca93893f4e14400c424e2 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 3 Jul 2024 10:10:05 +0200 Subject: [PATCH 02/61] Add navigators/demo module --- readium/navigators/demo/build.gradle.kts | 73 ++++++++ .../demo/src/main/AndroidManifest.xml | 21 +++ .../readium/navigator/demo/DemoActivity.kt | 11 ++ .../drawable-v24/ic_launcher_foreground.xml | 30 ++++ .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes .../demo/src/main/res/values/colors.xml | 3 + .../demo/src/main/res/values/strings.xml | 3 + settings.gradle.kts | 1 + 20 files changed, 324 insertions(+) create mode 100644 readium/navigators/demo/build.gradle.kts create mode 100644 readium/navigators/demo/src/main/AndroidManifest.xml create mode 100644 readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt create mode 100644 readium/navigators/demo/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 readium/navigators/demo/src/main/res/drawable/ic_launcher_background.xml create mode 100644 readium/navigators/demo/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 readium/navigators/demo/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 readium/navigators/demo/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 readium/navigators/demo/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 readium/navigators/demo/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 readium/navigators/demo/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 readium/navigators/demo/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 readium/navigators/demo/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 readium/navigators/demo/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 readium/navigators/demo/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 readium/navigators/demo/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 readium/navigators/demo/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 readium/navigators/demo/src/main/res/values/colors.xml create mode 100644 readium/navigators/demo/src/main/res/values/strings.xml diff --git a/readium/navigators/demo/build.gradle.kts b/readium/navigators/demo/build.gradle.kts new file mode 100644 index 0000000000..0aed309b04 --- /dev/null +++ b/readium/navigators/demo/build.gradle.kts @@ -0,0 +1,73 @@ +plugins { + id("com.android.application") + kotlin("android") + kotlin("plugin.parcelize") + alias(libs.plugins.ksp) +} + +android { + namespace = "org.readium.navigator.demo" + compileSdk = 34 + + defaultConfig { + applicationId = "org.readium.navigator.demo" + minSdk = 21 + targetSdk = 34 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + isCoreLibraryDesugaringEnabled = true + } + kotlinOptions { + jvmTarget = "1.8" + freeCompilerArgs = freeCompilerArgs + "-opt-in=kotlin.RequiresOptIn" + } + composeOptions { + kotlinCompilerExtensionVersion = libs.versions.androidx.compose.compiler.get() + } + buildFeatures { + viewBinding = true + compose = true + buildConfig = true + } + packaging { + resources.excludes.add("META-INF/*") + } + + sourceSets { + getByName("main") { + java.srcDirs("src/main/java") + res.srcDirs("src/main/res") + assets.srcDirs("src/main/assets") + } + } +} + +dependencies { + coreLibraryDesugaring(libs.desugar.jdk.libs) + + implementation(libs.kotlin.stdlib) + implementation(libs.androidx.legacy.v4) + implementation(libs.bundles.compose) + implementation(libs.androidx.core) + implementation(libs.androidx.appcompat) + + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.ext.junit) + androidTestImplementation(libs.androidx.expresso.core) +} diff --git a/readium/navigators/demo/src/main/AndroidManifest.xml b/readium/navigators/demo/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..b6ae97f20d --- /dev/null +++ b/readium/navigators/demo/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt new file mode 100644 index 0000000000..f298368afd --- /dev/null +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt @@ -0,0 +1,11 @@ +package org.readium.navigator.demo + +import android.os.Bundle +import androidx.activity.ComponentActivity + +class DemoActivity : ComponentActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + } +} diff --git a/readium/navigators/demo/src/main/res/drawable-v24/ic_launcher_foreground.xml b/readium/navigators/demo/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000000..6107c771b7 --- /dev/null +++ b/readium/navigators/demo/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/readium/navigators/demo/src/main/res/drawable/ic_launcher_background.xml b/readium/navigators/demo/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000000..6b753e2187 --- /dev/null +++ b/readium/navigators/demo/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/readium/navigators/demo/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/readium/navigators/demo/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000000..6f3b755bf5 --- /dev/null +++ b/readium/navigators/demo/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/readium/navigators/demo/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/readium/navigators/demo/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000000..6f3b755bf5 --- /dev/null +++ b/readium/navigators/demo/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/readium/navigators/demo/src/main/res/mipmap-hdpi/ic_launcher.webp b/readium/navigators/demo/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..c209e78ecd372343283f4157dcfd918ec5165bb3 GIT binary patch literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG literal 0 HcmV?d00001 diff --git a/readium/navigators/demo/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/readium/navigators/demo/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9 GIT binary patch literal 2898 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 literal 0 HcmV?d00001 diff --git a/readium/navigators/demo/src/main/res/mipmap-mdpi/ic_launcher.webp b/readium/navigators/demo/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..4f0f1d64e58ba64d180ce43ee13bf9a17835fbca GIT binary patch literal 982 zcmV;{11bDcNk&G_0{{S5MM6+kP&il$0000G0000l001ul06|PpNU8t;00Dqo+t#w^ z^1csucXz7-Qrhzl9HuHB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!TQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i literal 0 HcmV?d00001 diff --git a/readium/navigators/demo/src/main/res/mipmap-xhdpi/ic_launcher.webp b/readium/navigators/demo/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..948a3070fe34c611c42c0d3ad3013a0dce358be0 GIT binary patch literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? literal 0 HcmV?d00001 diff --git a/readium/navigators/demo/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/readium/navigators/demo/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f GIT binary patch literal 3918 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp zwO~NVXwXCl;jE<}>%@xz|=8fIJAB?>+E{7)|4l${4ngA3G|=r z2Dyv;VVWSgZx9Wj>qUjleGl3Ei9K4>h!(lPS%8VOG>Xu0%6VDz^O=bjJmuP7>DeUv zrbI}MlHB^^d?{zv6d=@_ZD2lg1&G7UjnVN{1}9WkaM3H~btX0GtSzB+tZ^qRgWo4m z!GmimlG$=wgXCnr6j@m<1gAL46#T~5Bnm=2{^@>|t&`9mkEPddj zAvG~@Tv~TAm2i%VW}R-g(Z0)z-Y|szHr@rk>4MAyG*Ma*7Yh#H7(!-5>DZ@8r;_dx z{prSe<>~099F8vsYd2xff7uAS%7{S)f(|@me3t2$iy&NEc7OUEchp@9A|X;;IA>8!oX+y(BKJ$EzV* znR$z;!L$s7uy@{OT~nG#B!NRraT8(X##Ho!0r_o@gg0CA-9H^;-uE&?$2$nHv_00o z%cbuUc-tCx$Uh&EZ4Nf4Zgqv)Y6>usG3>GeQnxx_Z6+PcbX-+ysbt1hQ`K1LDpOE? zrAhIZhSN9yVIAOa22gn577tbc&i3|3V8NWy&!tw##`}9*x}gtI^h1DzZRA>UuaJG) zaZ7j)dq!O}{?#8Y7~7i6fHh4{`pL?>-18|p!S75Y#^DM>-S3)vuZG+Q7l@ek zQP~#cBpWgg#mApc_sPYjpw8odQuRokmTkzcNl`^CcKB7e&;zViV;{Y{o^Y$%7i0m# z62%#1Lq!RC?}lK>%mp}T!3Xv;L*0v*>USLm``N%>w>@fwC+#T&Tx2bN4w(20JB}oU zuSa6v^kXi0xPs?pbaOHnyiqq6By1EZY9OZ^^QA>{q-Hsd&m`pbQ%8121aWG-F5xf zlZ%;B{;C>X19|`^_?dVyCq>n+41w7|!tUS!{9rHlbhX=SZO5CQ^;!Du_E7*`GiR^Q w)2!4MKjfSAeNo!9>IaV6aUZ*?W>} zs4%E?srLW`CJh0GCIK@hTkrW7A15Iu%N&?Q^$0+!{Tv&|t^Y@u%!L zglTg&?Q5q#ijZ;&HBQ?FNPp;k3J5!&{^+SGq?AX~SiOM9jJMRpyP?RCr@z38AQyy&WRMaC;n4una$~nJKSp?q|s8F00c9?Q! zY_ovvjTFm+DeQM^LXJ#v0}6HRt3R1%5PT*}W!k8BEM;Jrj8dIceFo2fhzTqaB3KKk zGlCLI)gU25(#u6ch6GeB1k@eHq7l{EHXv0n6xE#ws#ri}08kkCf8hUt{|Ejb`2YW* zvg}0nSSX1m=76s?sZhRY$K=3dpJ+y*eDULGnL2}4>4nvW^7_<~wIM_5fjvwt4h1|g z)g0Z6ZFq9j<~9~b8((~TN{Z?ZQfw|is&Xp~AC61sj;xItKyCHdI|tCMC_LbXF>~vR z=w6V3^H=W4CbAgR4#xw}ETTwu2guW~=Crl@SMXv85jQ=%y!s^?m4PI0My7MWICO;- z175jm%&PcPWh8QdOU(#8bp4!N7ET-+)N}N2zk2)8ch|4Q&lPFNQgT-thu053`r*h3 z_8dI@G;`zn;lH$zX3RzIk`E8~`J=BBdR}qD%n@vVG1834)!pS1Y?zVkJGtsa(sB~y zNfMYKsOJb%5J(0ivK8d+l2D2y&5X!cg3BG!AJ}910|_${nF}sC1QF^nLIhzXk-Y#x z0)&1iK!O;Og0Ky!;`b~v%b$`S4E&fB)1NB4v@8wr( z&+NX4e^&o)ecb=)dd~C!{(1e6t?&9j{l8%U*k4)?`(L3;Qjw z#w7FS+U(94MaJKS!J9O8^$)36_J8;thW#2$y9i{bB{?M{QS_inZIJ!jwqAbfXYVd$ zQ5fC$6Nc9hFi8m^;oI-%C#BS|c8vy+@{jx6hFcf^_;2VRgkoN(0h!_VSGmgNPRsxI z8$rTo0LaYq-H5i&gtj81=&xU?H-Y2==G@uQV7E`@+2E9XQW@{&j`?EOktk|Ho{HU>ZqDzvgjwBmdex z&uZNd2C1h{{}2k6Ys9$*nFP3;K%u!MhW`uZy7Sn`1M1zs@Es&;z*Z>Gsh@-3Fe6pE zQD2@cqF((NrRevgvLsvM_8;;iNyJ5nyPyy?e!kvKjGj`6diRFBEe49Oa7wwkJFV7Z z$YT&DWloYu-H?3<0BKn9L&JYDT-SK~*6c5pi18P26$JESKRYj{T7Zk6KiRJcbvOO*{P56Q6s8msbeI3>|j>K9}Q9UBeq*inXKemCm`-<5|-$ZyN4u$(3 z&HcvqehFD%5Yrmykg-^d`=BSa8(i=>ZoC77^mWY{evp(km@aHqhUECBz76YiR+VYK zY_avFC~V3$=`6C4JhfHAQ@DZtUOwH`L;oYX6zK0-uI^?hS$ALfq}A7evR;ohJHij} zHSZdW?EKv9U1s4oD*<(0oQ*;MaQ6@cvGL zuHCPgm_NhVsgp^sfr*ia^Db}swo1?O(_Q2)y+S$CBm+g=9wCOUPbz(x)_GbaKa@A7 zuI&!ynLiZRT#V%_y_-D`0Z5lT*auoe{(U5NylTzFSJW()W-#F6*&A`LNO1bV#Y;QJ zSbLBnp|B^dtK|KIWC|No>JjWBWE@n7O)x{&^E(WMeMvp57#qA8m* zeTow*U@_86B#Fm*rxyYu5PRWaWHx8y> z*qmHEp(AMDl0v)ij(AY8fnH=~ZwwjVAbu*m5;xPfidh@ov6d8g zfJsi&!QyK53Es%sC39ts;54V68koALD4b|%tNHW0bIkZAJKa=W&FomJSEDT>W1xIX z1x%Z>AvNIsSPLcn3RTcHXb@KB?cuM)=x6fcIx>&(GxqZ8w3p#jJ(GVgc*`c0HG}dv zIop&Qim!K1NFwic%07KcjWgHBPUkq7f~lj;TPqVGTiT#cUeim>;nY`>h@a*S{qQex zQ`z62WK|Mj)Y{tfF{;T4P;c8$Q|KU?Joh zIkA^z%X7z|r>4aTh@|StTi!-r1D!g=zb#3d#{{&K3CqE$Iz-UH<%37c zRfkO`&uM%#AD3PHv`g5t0e^O%nVL0d{Xlx^EjEC3#skF@`zl-7PF^0oxW)1!C!JxR zWvuAHH?)61FKA1QeT*_sY7;_Id#!GmV4n`MO{~sv}VLSK` zXRw=Y=Clz*00B(5y^K;gCZMAzjT5+c3IC=)l(9VIDdatpxj3y89WwI|bH&$!ZEvp` zPR!T@#!(|KfI-w?!&+7$N3F6>tD{YO4Qg$d_`nNEdfVCha9vaPn0jI0`)`@*72hq! zpU5ND^P*RoEkbD5o#az(-g=Y)L>HH>Oc%}$ zT3Rs_ih0;4+Lv4Y;@Iv(;fUbQ=i-G(#>vghec~*j(I#r|5mqFiJBpzi&hzEcD{u$< zRsm0BVYn=pT;0>R(itW|*D&;O%bOc7et9ACaH#J>z3A1A~6fdP>pmbM%xzm4>|;c_?B+%sl;Qs2{t!60$^u zH1t@9^6>;?!FuusnISi$f5CL&;z?EqJN$FBuWDA#D5`cy_UvCFIVvf{c?4N0teh;d zET$7aVbj08KTQS!x?Nd1Is8q8qFzs}a=!@nJ;7FSfCY^T@D-gpw`w<6e#X3+;O}1h z$%I!M)0bg|EKUA04Qjn@+x{Rj8vt6Wn!R|3A92z}^$KfF5(#CWr4y#~re1CN4i4w0 z#GsypBR{xA3Er7sgAi(|}1-W?s~n$7?K|9WL8kpVfw-;#b9 z+mn;=ep!162U5R>_t}fOt~tE?s#m( zO-S$7>Ay6*hHdZ)7_oU915WYYCIX;hFI-U2EWYX!pllONr@Q--2o~`!isi6vTPLJ4@(|o=%NHYjo0_S&q*UQIROw@*N-By@PaQ&;YxFZ0aR zX&}LeOEz);#m~Hwm^VAY8DK}b$F4bo{jMN?d!lxKPhNklzr^Cd`0f4oJr^z=I|l`* zm8AHm*fPV`0=lF3Pnnp}&J0N1X@}-D94YvmUabFrLGSnTz7Mu^21F#O5tN#CuY9Vh zUZBH=ez%h*wkf0hBtXJh1SN3d+IF{gzT7lp)j}n?03lt;XSQRAh7qd&v;RwTYDuQ# zbI2*r<>?x-G0@hM{;%{VBD7nLKt~D`T~-HAt5;h%i0_=Ifs=yHma5dhJ+QMG?Ux(a z|E?1CMy1!~oA`FP!k~iG=t&5#>bVdz=peT8HMB6Y)#7PpETtNryT^+Rv3vpJaF^zP z{H}0-LyV9Fu21ID%wO9f1IKlFr1p4c{o-?03vyB-tr5duk^&L$;m_|f$vs`^Sl{j2 z95}oY{LlY+=ZS%J+tZoXCd0*sSU7w^gjovXn+g7uyra5{cU49@yHf#Z^Jl-$9cIfo z+AJuxH$VLb=#+uBbVmUjnx zxb1pZ@-O9=AIk4@S)m6fJ2?{HrNYwwnL3a45muuNjr;6$O`bGEM0T4A2_S$t=86*- zcO+0mywg*j#A4mU}enR_!cGmIYQ;qwfchWtFEXL)AK%*;=j znYne+hS4EMy3S)C*mZ1KI>!+)0V@9!N6H$Y}~MJ{rYuf zz^KljIWvFi-?#?V@LPR&c6Nn{!=XM z>}-h$S76;$H{E{Y%@^zlmOl^efBwa%UU+jJD9UVukQ3ti_kH-?H*RC0?M1W%FCvMB zM_+v6fk$6X2sx)-p~B3&Kl{nscK}pNLM*qjtpaf9>AU{-iPKQZR8yCg!TY}Qg*(;) z)gdvCcB%kppZc$VdvsK@)3l1{&DG!d_6OHOS`y=ITLEVu`unSKA2E%JD*DVX{LJ}K z9l>hMRDqxQh0lnpGHpVYneX}eA3Pt|2v%=q;rt)``R|#bDyB)OXY&vI_@|*}h}G?^ z@aZ4_!7cQPX`!fW_?{oT1NTwHs#l5L-0`E|y@48<3Q^HFf8=Idi zpJYD%1MkII!~|7I^WGo)IF=?{>ACnjJ_WUi39C}!Q{QnheVJqeKKqq5^o5CBde(g9 zvw$X6^jz_^E2$wSw4!q5*RG(C2_^XO$HBn_55vbl44OnTTRwRaePP0vo{K)U1#99& z<>rq7V&V(<&@I%MFoN5zrY}sz=(*-L&}1QQ*a%`u25h{cFj===17eB_uGuzG&byQ< zrm8BJZl4r_E$3k|Wo6FW0-6M7>qac5uFQsQcmkLWGfeH74S3Z_rJ!jgN++!@i=HW8 zkyjI(oPH-+-N#Qc^-mpNO`bc6r=2-<%&Wy5K1vfFJB(L_IkpS6fY^NmuL8qsgj>MD zn~BHH9WM~32_3vd=W&B)k7F9q%stJx+b_L_X-4zr^LVUMCmyCTA3sWtkvsmME?Xiy z?xOSfB=_$oY06~J-HcCq&)qcW{j;uP;?Dm}=hkq?zh&n!;m((-G-u_t|6x399Q;>A zgNpxoJNj{u|MFDH7Rhq@FCAl0dE|ddnl!oh9{Lq?@JDoR6L;C941IK`ISfdE$4S zE0AUQ8+2|Ncl_q5QkSp#AODp~(^mfP&%Au@@|TBQwoP`UU+V{6u8|)6ZA{~uKmQ*M zmrMTDU8S~8Eqi{^v0Ug&5Upcm#y7Z1(RbgZAG8jB$eRwCspQ)>5;U)oGZ&E5aeR*K z8Yt`Y0$G))Yd(Y3KH}tA4`-_QmNke5hU_|nq=xtyjwW(_o?itz>B>WM&^63bNdQ)k@-IgDHW*RW$Xo9#RzrTrCn7L2H{9Amq|qNg@#eZY=|P zCoI?2s+L)zsM%WX(NbVEY^`C>lFjIBYmJ6@DKJ0ZT4&F&WHW!dwa%QzOG!?jY_2(S zDcEzZbz*2Q!43|z))9yOP9X1Xt%DXzwY(3tl-TR=Qb_MbZYRrooh;dYYmS!U_as1(=YVB?Q_A|tNu5Ut&_q3jbfDM zoFxT^uEuH`nX3*sB%K?GuHUkweYReBwnHqh3P)~`+s3+Tj!rDA1e)8vuBv5J*IsxC zkd^~b(aGzArj08{>cnzOuy04C+C`}gb|Yz-1avxeWzev3NzcHbz_&4W@QCr$z3~w=8Ua- z`;vfG1~BP8CyLb=F7t1am~ph_#|O%$khSJ9%Vtcn)YmpgQxF?xM^_Vb+5fnpB^W0I`f%X8gb9#X{Q-yJG0{Z56aWeI&zPxnf5pdJA38bM`cYnS#x)% z`n1tFf$i)W-hGm(f9mde^=X@NcV_lFb=P`4&CI&H=IArijGwdCk&X@uQ$5xmj!~^? z#$ROCI)V-~t%L%GS#wo@U27ddR`4`3)WoB{R-4snfNrfee|kI8^bu#yDgYqOwas9# zmcb`3!kRJ`Cr=_tq)8aMt{aGtUZsqwVlj6DgCGre>AEt&x8H_in!x@uwgExIh|-mA zjdaC(29~CTVSaaF7HPbql&*9Uo8P@f)>LqCXclr}peS7_1BQ28u9PO8Eq1@`l3q9o zkfKCaO2?T?ZyA6loW<#9_c^O=m<&h}CA!ineAD@=(gbq`vyT|tiJ6#^B1$P;;qax` z55k&Q?wEh#87niLo*+n4L@65J(Nz~=Ya%7^(miLb(E>A3B@|Jjl;FU&D>o|9#7PJH z?|ago!o;WC^h=|T7PVBg(DAB}72cyUS zb(f>Bwbr!F1eTCO5fpj<{PqhY5>143p?~5ZA5H40);=@M#MYvrB6gqHbU_!GSY??i z%s=>-ciA4*zOOZHds0a(kWewZ4h(k8h(ua7HX)Au&mY~H8KY6(_cb$_&fA@QjIW-*heP3%$d!m5^AdnT}`12qA^c@!g3DOwZ5WwE2?)-yU z!)Vx#Mtxt?FzFTwK!77sy7)sMzUd->w4^bxtpM2j!b1pjgyk zGKwWGeb4)^zjy{9Es&PU1}gwg?|J#L$KJB7ett9@4M%-nGtIQr0>Fl@8-yh`-+1ed zS6r}(MeSvgSoFmH*_WPu@i?}!AB~2?;i&IxrkNg~cQ9Som98tcq)k^|eeER|Zl77t za-TVUc;DNvzVXJ%w52+#weN?+;i#{f#!Oc&z?81*N>^e~ltRS%ZI@lR{rs()HmqG! zx*}ZrI-EZ}ckJMiy>A^oofwDfC~IH)z8{VHKGT@#E5I(Ll&+MnMCl>~AV7+>Gi%mF zkU1QlKASdR0B80!YhP<$Ywi0?W2Ux45oPfxv9QolWzJPD^weBfvo4SONxP35106sAmh(e+vAs0GboFD@PvNs)jNPvarhW}0YliZEg{Gazv z+JDIpoojRVPr<*C|BTq<`6ga{5q^8^!|0cxe=rZ!zxH3%f5ZO0cQ*Z<^$Yt2{|Ek0 zyT|*F+CO@K;(owBKtGg!S^xj-Z~rga2m6nxKl9J=fBSuNKW_dLKWhJKeg^-Xe`^1? z`TyJj)8E!#>_3Y?uKrwqq3LJ#SGU>AzUO|6`nR^u&3FNN_jGOc zw)Nw`wr3yIKhgcee6IaN=ws>M{6677%)hPwx&HzC(f&u~&)6@b2kNRzBDQAP0*H73 zq%McOmRk{B3i47qRe=DA*$&odrbEJZ*pV9XXa&p@wlW~@Yfs>V{yiTtplMhgM*-Bz zsSnlq&pG;z0OUN%$~$3=g1UF+G*>+17eRbBf3=y79J}KR8owon@$1Z7MIrvvWWH)34nK2SD)GsrJ{l z1Cl#oVo3A8qY3e=aF)qzms~FG#2$LzT=gs&aVMOj>(%{y<&O0cG!nCiESl~x=^dF{ zKvj8F1K8Ng171wwM5Fh4KoQw`_c6#y$(5cAm7e}~nJ#A*fx+c9;y#&W!#VukR)ugk zKp3=+;Ut+IYn%m+r4d*<`L2h%aDnX5}^!5R|H;(34AoVWjRx(msBZvk;rCI*|~ zdOijqI@9Z{Vu!~jvHW{lBa$rnl4+!s_5sfK3bCGk-B%iDe&@-}+%fOKU|(9?V1 zHE8&@4z)Kx!RAvAs z!Wic9=o#(bg?kc-G68-m(jZ`^=XGUXb)}t(%&~sjFnV^sEX%hSy6UKC4iOhgV=BHV z2w`4g7Y=s#Vu2B_?#VQ|hP39@eArgfX>-0S+dd&^mx0*wp}>)x;c4RUgxz%;oNe?& z-7-lJ@Y^2^C;=qJsxx5|xF)*pTGhch2B&kxtn;f!7=gznk}I3}Dh}(CoMXgA5-p&kS202!l?!fT3t|HG*rIP~mS* z$Wjo}jq3}z$Qq!9yrtd3fM0N629ZM?LU$nv@Tv9b7I;D|;0H2dsA~g7Z7zp1| zB)XmrkMgF6OQr|R)HHD^TE{Y#j!~SR?b`Xt3Qs`B+x<hxexYeAjMUWdZ-*n9%(1)Wb(n2U<><7&9dwGJmrob)4%H? zlQ%z+L-^$dFhhH|@u$%97Qz?*Ynh2VG@q|?8vY&L74&fs&_b&3$x&Oyjl~LQDRRap zJU4U*R+(2Dd!G+lh8!V{pT_UJn+^1Qg6$` zqkNm(a#hWyc6SP+p5=C4HL8-m`pO`5o~`-LI?_h5CsH?F_%?nDodmz&pWR20WTpJE z?N|wSzLjMUK8E)a2tI}Lf;+;*M|h3Y(U#>)g1>zk9|Hd}oZAa2 zLYBWBoSW!Ts!RwXr^8h+U*@{9{zqS^iH)Op<;r`Uw~nc}<^$V~_i%$GFjaG?X1@E|M`h)nekvFKt`Dh-f>@|0-`Xoq)o` zx;JmzDfOV9qCx|EVpogEe0LK~tGS?5$$L_i6P$P6wIsCQaP_;d{{N=iV@+8LI}o#( zvo*Ejy=IIn{rdIQh1&q-{EuohpVOjJ^Q3lD*YTp37$^RRgn8ihpdu5{Ct%5-KO!VL zcNB6dUajXI9jkm-P|i3~GB-A(X`P1Oqqb$tcku)UJw0w3GeUijb__#QT4j%64z%EeB7S?jlWwx_7&+EEvB|6N=kV}DwnyAlX=?j`) zmU#!$*^@NIu#n_d7;WoJV@*Fbv9|yJO4;n|BNF2xy(54RyB>t~8lUOUW$&2%Nwi1y zx6JxW88>U2$#qhl^6KUbtmg9}D0o5vYDT7kWJthLGkpGnN4T>{St^_EU>4;DmLF9o zr|LqsA8_MoNLQ=}w?8u!ziSZ@PC#Y<#9uJFo-ozVo6D;<8j^1$c|qAE3ZTE5i~zmE z$BU5lw6l=EWsg^y^;8>r9qH{xfL|~PZYK#md$zZ0?o11gV<*WSW~cgy2GYGQir%wf zt4iW8D+;s*;RGrmd(-T<@2&j(Cb9xhV*l-x`TpK`xq|7p?5R%5*s!69?2c!cC*VY* z2DE^9pvOPLU!1e}wA8S8opcTJ3`NB>hY=JQnL~QFXR4K8A$BqJnoEB$wn-%u@E6Mh zCfMF4kusv3N!(aHC}4)Xs^xoOwXd%e^6pi5|DZo=Q25j+6HlJ^7FodH6y1bMROR^q zGu6)fopS`h%Sw<;ZH%TEPf+#81-#_v+@8nlR0jLcIDKQtLleOC)6yLZgC!D9X3GgS zohwU{v$jl=quD#Go^hB{`@Qw*a%`(^jyT~=q^bWgGzRj;|12J55HWdCWV}EB|K=%N z3Nq-qxJJ`>^|1MNN+q}zTB&ooE3j==AgK@^UW<^oSbeALa2peF)Th6{@sj0KyMNHZ zksk1+MXN2tv+22A%cQOGpS9)77(uP9mh+!5T5ERLvF@b}$+WvXM45Z?-kCa)fb~f1 znVbTD$Gx-0Zxc`0D@YgHakge6SL0H`-vN_x?AP0>iGH0_EE&=v83hMJgaKAI0jJXm zVxVz;X<$v6WW7}fxROO7vr#YLP;;lij5VrX{;>7kK6TtOH&6|Ar^xo>00%+u$C4@# z>!jOt6*3><171+WxoZnKDTzJtDRw+T030;yI}~uV@9fCnei^I*j>Bp&mzP2d=FPb_ zCM*l_+$LDR3B*a!A$g#>xsrZvw0lckxmMg>0aQd7tPyN=t{dgXb;Ie+T8{fZH=gdu zM7Rg9c(kg(Jg0?ARRRl=AONFKrvFj)lTY$KfT%6^6s`mk*ABGhsce*LsoD>K{z_M2 ziPpnu+lw22PfF!CoId^6n*G4H(Ix+#+N{C(da7t1BYMGEaE#PdpOLxsVD5riQXHp@OX;`S`8VnpM~)I920w~<3|mo0 zf8~Az`*?2?H&gZ&*K&bRkV@qzvMlRHXys8*Ze2+1c?5o!^+$&MHxB@4Ee5cke52R! zmn7AZtY6ST%ixgU5)%$%QcwHj7Es-Qu^kLAPwy%7pGBw_4Q9#da^W2$}axNHr03)_nw z5?yuNmXrI5HgS46)c5&}B)Tts49oU92>3xBLLy}FMUW=84DQbVq^;7_e7|(Sdz|&J z73N+M`rc2rt*oSWu#7S{*s~nH6HRHJS1SmzeXk|;CA)FI4bat3<%}nkB%;;?=F>B7ms9QSxv#@+69;@>QaR?REYX4&)=itG>rM{<{A79Rmk)`5ON#GL`*KX%}Ihk3w(RtM-WLt z?f&FLF}4N^yE!(pZ&Yj&Bc`~K0@4_}*0Om?wN|}4WJ>WL;G^H2*QpgEkGA~OET-Km zkwz|5{6dnz1U<2Pe9DNL>3g5FEIvp1jzP&2K#z~j%g6!7B;^zF+o95?fV{3mnB8*RMhCDNp>Am-3e@jNfMj?jHV$MWjk!DDKP zkAz$Y?Sr)!GUOX}qTQ5aMh|wq1uq}~joWyKl=b_LboM#wi{CMuz5x6BKlA-qy++cM01D3b7`uD z#l6M4pI;JCypO8JZ6?U&wNxR!{4oB_ zlV!x9+-&Qy6{%MQ{~yoZGkKiTSC`YS_j22~G;xUV855g2&C(zm^V!(wpcm@zn{%!g z4}JGo(sGZ1O~to-}le

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s literal 0 HcmV?d00001 diff --git a/readium/navigators/demo/src/main/res/values/colors.xml b/readium/navigators/demo/src/main/res/values/colors.xml new file mode 100644 index 0000000000..045e125f3d --- /dev/null +++ b/readium/navigators/demo/src/main/res/values/colors.xml @@ -0,0 +1,3 @@ + + + diff --git a/readium/navigators/demo/src/main/res/values/strings.xml b/readium/navigators/demo/src/main/res/values/strings.xml new file mode 100644 index 0000000000..19f975c416 --- /dev/null +++ b/readium/navigators/demo/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Readium Navigator Demo + diff --git a/settings.gradle.kts b/settings.gradle.kts index 2f45647ca0..5a9f150e9e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -79,3 +79,4 @@ project(":readium:streamer") .name = "readium-streamer" include("test-app") +include(":readium:navigators:demo") From b11b053d40f69d82ce19ccb182f79922d57d6758 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 3 Jul 2024 11:39:49 +0200 Subject: [PATCH 03/61] Complete setup --- readium/navigators/demo/build.gradle.kts | 4 ++++ .../org/readium/navigator/demo/DemoActivity.kt | 9 +++++++++ readium/navigators/web/build.gradle.kts | 1 + .../org/readium/navigator/web/NavigatorState.kt | 15 +++++++++++++++ .../org/readium/navigator/web/NavigatorView.kt | 9 +++++++++ 5 files changed, 38 insertions(+) create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt diff --git a/readium/navigators/demo/build.gradle.kts b/readium/navigators/demo/build.gradle.kts index 0aed309b04..a366e597a7 100644 --- a/readium/navigators/demo/build.gradle.kts +++ b/readium/navigators/demo/build.gradle.kts @@ -59,6 +59,10 @@ android { } dependencies { + api(project(":readium:navigators:readium-navigator-web")) + api(project(":readium:readium-shared")) + api(project(":readium:readium-streamer")) + coreLibraryDesugaring(libs.desugar.jdk.libs) implementation(libs.kotlin.stdlib) diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt index f298368afd..c727566b98 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt @@ -2,10 +2,19 @@ package org.readium.navigator.demo import android.os.Bundle import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.material3.MaterialTheme +import org.readium.navigator.web.NavigatorView class DemoActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + + setContent { + MaterialTheme { + NavigatorView() + } + } } } diff --git a/readium/navigators/web/build.gradle.kts b/readium/navigators/web/build.gradle.kts index f930a2f4d8..a988b5462c 100644 --- a/readium/navigators/web/build.gradle.kts +++ b/readium/navigators/web/build.gradle.kts @@ -15,6 +15,7 @@ android { dependencies { api(project(":readium:readium-shared")) + implementation(libs.bundles.compose) implementation(libs.timber) implementation(libs.kotlinx.coroutines.android) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt new file mode 100644 index 0000000000..397e10e17f --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt @@ -0,0 +1,15 @@ +package org.readium.navigator.web + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.remember + +@Composable +public fun rememberNavigatorState(): NavigatorState { + return remember { + NavigatorState() + } +} + +@Stable +public class NavigatorState diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt new file mode 100644 index 0000000000..422e76ba49 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt @@ -0,0 +1,9 @@ +package org.readium.navigator.web + +import androidx.compose.runtime.Composable + +@Composable +public fun NavigatorView( + state: NavigatorState = rememberNavigatorState() +) { +} From 682be778d7975272768e53b1f2ab4902899c1e8d Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Thu, 4 Jul 2024 15:25:50 +0200 Subject: [PATCH 04/61] Can load Bella --- readium/navigators/demo/build.gradle.kts | 1 + .../readium/navigator/demo/DemoActivity.kt | 58 +- .../readium/navigator/demo/DemoViewModel.kt | 98 +++ readium/navigators/web/build.gradle.kts | 11 + .../readium/navigator/web/LayoutResolver.kt | 38 + .../readium/navigator/web/NavigatorFactory.kt | 105 +++ .../readium/navigator/web/NavigatorState.kt | 62 +- .../readium/navigator/web/NavigatorView.kt | 39 +- .../web/preferences/NavigatorDefaults.kt | 9 + .../web/preferences/NavigatorPreferences.kt | 21 + .../preferences/NavigatorPreferencesEditor.kt | 72 ++ .../NavigatorPreferencesFilters.kt | 34 + .../web/preferences/NavigatorSettings.kt | 12 + .../preferences/NavigatorSettingsResolver.kt | 33 + .../navigator/web/util/ComposeWebView.kt | 747 ++++++++++++++++++ .../navigator/web/util/WebViewClient.kt | 17 + .../navigator/web/util/WebViewServer.kt | 161 ++++ 17 files changed, 1507 insertions(+), 11 deletions(-) create mode 100644 readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/LayoutResolver.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorDefaults.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferences.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesEditor.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesFilters.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettings.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettingsResolver.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/ComposeWebView.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewClient.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewServer.kt diff --git a/readium/navigators/demo/build.gradle.kts b/readium/navigators/demo/build.gradle.kts index a366e597a7..80eb723283 100644 --- a/readium/navigators/demo/build.gradle.kts +++ b/readium/navigators/demo/build.gradle.kts @@ -65,6 +65,7 @@ dependencies { coreLibraryDesugaring(libs.desugar.jdk.libs) + implementation(libs.kotlinx.coroutines.android) implementation(libs.kotlin.stdlib) implementation(libs.androidx.legacy.v4) implementation(libs.bundles.compose) diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt index c727566b98..5135eddfb5 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt @@ -1,19 +1,75 @@ package org.readium.navigator.demo +import android.net.Uri import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.activity.result.contract.ActivityResultContracts +import androidx.activity.viewModels +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier import org.readium.navigator.web.NavigatorView +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.util.toAbsoluteUrl +@OptIn(ExperimentalReadiumApi::class) class DemoActivity : ComponentActivity() { + private val viewModel: DemoViewModel by viewModels() + + private val sharedStoragePickerLauncher = + registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri: Uri? -> + uri?.let { + val url = requireNotNull(it.toAbsoluteUrl()) + viewModel.open(url) + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { MaterialTheme { - NavigatorView() + val snackbarHostState = remember { SnackbarHostState() } + + Scaffold( + modifier = Modifier.fillMaxSize(), + snackbarHost = { SnackbarHost(hostState = snackbarHostState) } + ) { paddingValues -> + + Box( + modifier = Modifier.padding(paddingValues) + ) { + val state = viewModel.state.collectAsState() + + when (val stateNow = state.value) { + DemoViewModel.State.BookSelection -> { + sharedStoragePickerLauncher.launch(arrayOf("*/*")) + } + is DemoViewModel.State.Error -> { + LaunchedEffect(stateNow.error) { + snackbarHostState.showSnackbar(stateNow.error.message) + viewModel.acknowledgeError() + } + } + DemoViewModel.State.Loading -> { + // Display nothing + } + is DemoViewModel.State.Reader -> { + NavigatorView(stateNow.state) + } + } + } + } } } } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt new file mode 100644 index 0000000000..7359498bd1 --- /dev/null +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt @@ -0,0 +1,98 @@ +@file:OptIn(ExperimentalReadiumApi::class) + +package org.readium.navigator.demo + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import org.readium.navigator.web.NavigatorFactory +import org.readium.navigator.web.NavigatorState +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.util.AbsoluteUrl +import org.readium.r2.shared.util.DebugError +import org.readium.r2.shared.util.asset.AssetRetriever +import org.readium.r2.shared.util.getOrElse +import org.readium.r2.shared.util.http.DefaultHttpClient +import org.readium.r2.streamer.PublicationOpener +import org.readium.r2.streamer.parser.DefaultPublicationParser + +class DemoViewModel( + application: Application +) : AndroidViewModel(application) { + + sealed interface State { + + data object BookSelection : + State + + data object Loading : + State + + data class Error( + val error: org.readium.r2.shared.util.Error + ) : State + + data class Reader( + val state: NavigatorState + ) : State + } + + private val httpClient = + DefaultHttpClient() + + private val assetRetriever = + AssetRetriever(application.contentResolver, httpClient) + + private val publicationParser = + DefaultPublicationParser(application, httpClient, assetRetriever, null) + + private val publicationOpener = + PublicationOpener(publicationParser) + + private val stateMutable: MutableStateFlow = + MutableStateFlow(State.BookSelection) + + val state: StateFlow = stateMutable.asStateFlow() + + fun open(url: AbsoluteUrl) { + stateMutable.value = State.Loading + + viewModelScope.launch { + val asset = assetRetriever.retrieve(url) + .getOrElse { + stateMutable.value = State.Error(it) + return@launch + } + + val publication = publicationOpener.open(asset, allowUserInteraction = false) + .getOrElse { + asset.close() + stateMutable.value = State.Error(it) + return@launch + } + + val navigatorFactory = NavigatorFactory(getApplication(), publication) + ?: run { + publication.close() + val error = DebugError("Publication not supported") + stateMutable.value = State.Error(error) + return@launch + } + + val navigatorState = navigatorFactory.createNavigator() + .getOrElse { + throw IllegalStateException() + } + + stateMutable.value = State.Reader(navigatorState) + } + } + + fun acknowledgeError() { + stateMutable.value = State.BookSelection + } +} diff --git a/readium/navigators/web/build.gradle.kts b/readium/navigators/web/build.gradle.kts index a988b5462c..f3d16a0aff 100644 --- a/readium/navigators/web/build.gradle.kts +++ b/readium/navigators/web/build.gradle.kts @@ -6,16 +6,27 @@ plugins { id("readium.library-conventions") + alias(libs.plugins.kotlin.serialization) } android { namespace = "org.readium.navigators.web" + + composeOptions { + kotlinCompilerExtensionVersion = libs.versions.androidx.compose.compiler.get() + } + buildFeatures { + compose = true + } } dependencies { api(project(":readium:readium-shared")) + api(project(":readium:readium-navigator")) + implementation(libs.kotlinx.serialization.json) implementation(libs.bundles.compose) implementation(libs.timber) implementation(libs.kotlinx.coroutines.android) + implementation(libs.androidx.webkit) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/LayoutResolver.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/LayoutResolver.kt new file mode 100644 index 0000000000..4f5fa4da7f --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/LayoutResolver.kt @@ -0,0 +1,38 @@ +package org.readium.navigator.web + +import org.readium.navigator.web.preferences.NavigatorSettings +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.util.Url + +@ExperimentalReadiumApi +internal class LayoutResolver( + private val readingOrder: List +) { + + enum class Position { + Left, + Right, + Center + } + + data class Page( + val url: Url + ) + + sealed class Spread { + + data class Single( + val url: Url, + val position: Position? = null + ) : Spread() + + data class Double( + val first: Url, + val second: Url + ) : Spread() + } + + @Suppress("Unused_parameter") + fun layout(settings: NavigatorSettings): List = + readingOrder.map { Spread.Single(it.url) } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt new file mode 100644 index 0000000000..53685e1947 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt @@ -0,0 +1,105 @@ +/* + * Copyright 2022 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +package org.readium.navigator.web + +import android.app.Application +import org.readium.navigator.web.preferences.NavigatorDefaults +import org.readium.navigator.web.preferences.NavigatorPreferences +import org.readium.navigator.web.preferences.NavigatorPreferencesEditor +import org.readium.navigator.web.util.WebViewServer +import org.readium.r2.navigator.extensions.normalizeLocator +import org.readium.r2.shared.DelicateReadiumApi +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.Link +import org.readium.r2.shared.publication.Locator +import org.readium.r2.shared.publication.Publication +import org.readium.r2.shared.publication.indexOfFirstWithHref +import org.readium.r2.shared.util.Try + +@ExperimentalReadiumApi +@OptIn(DelicateReadiumApi::class) +public class NavigatorFactory private constructor( + private val application: Application, + private val publication: Publication, + private val defaults: NavigatorDefaults +) { + + public companion object { + + public operator fun invoke( + application: Application, + publication: Publication + ): NavigatorFactory? { + if (!publication.conformsTo(Publication.Profile.EPUB)) { + return null + } + + if (publication.readingOrder.isEmpty()) { + return null + } + + return NavigatorFactory(application, publication, NavigatorDefaults()) + } + } + + public sealed class Error( + override val message: String, + override val cause: org.readium.r2.shared.util.Error? + ) : org.readium.r2.shared.util.Error { + + public class UnsupportedPublication( + cause: org.readium.r2.shared.util.Error? = null + ) : Error("Publication is not supported.", cause) + } + + public suspend fun createNavigator( + initialLocator: Locator? = null, + initialPreferences: NavigatorPreferences? = null, + readingOrder: List = publication.readingOrder + ): Try { + val items = readingOrder.map { + NavigatorState.ReadingOrder.Item( + href = it.url() + ) + } + + val initialIndex = initialLocator + ?.let { publication.normalizeLocator(it) } + ?.let { readingOrder.indexOfFirstWithHref(it.href) } + ?: 0 + + val webViewServer = + WebViewServer( + application = application, + publication = publication, + servedAssets = emptyList(), + disableSelectionWhenProtected = false, + onResourceLoadFailed = { _, _ -> } + ) + + val navigatorState = + NavigatorState( + publicationMetadata = publication.metadata, + readingOrder = NavigatorState.ReadingOrder(items), + initialPreferences = initialPreferences ?: NavigatorPreferences(), + defaults = defaults, + initialItem = initialIndex, + webViewServer = webViewServer + ) + + return Try.success(navigatorState) + } + + public fun createPreferencesEditor( + currentPreferences: NavigatorPreferences + ): NavigatorPreferencesEditor = + NavigatorPreferencesEditor( + currentPreferences, + publication.metadata, + defaults + ) +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt index 397e10e17f..291b469dcc 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt @@ -1,15 +1,59 @@ package org.readium.navigator.web -import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState import androidx.compose.runtime.Stable -import androidx.compose.runtime.remember +import androidx.compose.runtime.State +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.mutableStateOf +import org.readium.navigator.web.preferences.NavigatorDefaults +import org.readium.navigator.web.preferences.NavigatorPreferences +import org.readium.navigator.web.preferences.NavigatorSettings +import org.readium.navigator.web.preferences.NavigatorSettingsResolver +import org.readium.navigator.web.util.WebViewClient +import org.readium.navigator.web.util.WebViewServer +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.Metadata +import org.readium.r2.shared.util.Url -@Composable -public fun rememberNavigatorState(): NavigatorState { - return remember { - NavigatorState() +@ExperimentalReadiumApi +@Stable +@Suppress("Unused_parameter") +public class NavigatorState internal constructor( + publicationMetadata: Metadata, + readingOrder: ReadingOrder, + initialPreferences: NavigatorPreferences, + defaults: NavigatorDefaults, + initialItem: Int, + webViewServer: WebViewServer +) { + public data class ReadingOrder( + val items: List + ) { + + public data class Item( + val href: Url + ) } -} -@Stable -public class NavigatorState + public data class Location( + val href: Url + ) + + private val settingsResolver = + NavigatorSettingsResolver(publicationMetadata, defaults) + + private val layoutResolver = + LayoutResolver(readingOrder.items.map { LayoutResolver.Page(it.href) }) + + private val preferences: MutableState = + mutableStateOf(initialPreferences) + + public val settings: State = + derivedStateOf { settingsResolver.settings(preferences.value) } + + internal val webViewClient = + WebViewClient(webViewServer) + + internal val spreads: State> = + derivedStateOf { layoutResolver.layout(settings.value) } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt index 422e76ba49..bd333e9706 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt @@ -1,9 +1,46 @@ package org.readium.navigator.web +import android.annotation.SuppressLint +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import org.readium.navigator.web.util.WebContent +import org.readium.navigator.web.util.WebView +import org.readium.navigator.web.util.WebViewServer +import org.readium.navigator.web.util.WebViewState +import org.readium.r2.shared.ExperimentalReadiumApi +@SuppressLint("SetJavaScriptEnabled") +@ExperimentalReadiumApi @Composable public fun NavigatorView( - state: NavigatorState = rememberNavigatorState() + state: NavigatorState ) { + LazyRow { + items(state.spreads.value) { + when (it) { + is LayoutResolver.Spread.Double -> + throw NotImplementedError() + is LayoutResolver.Spread.Single -> { + val url = WebViewServer.publicationBaseHref.resolve(it.url).toString() + val webContent = WebContent.Url(url) + val webViewState = WebViewState(webContent) + WebView( + modifier = Modifier.fillParentMaxSize(), + state = webViewState, + client = state.webViewClient, + onCreated = { webview -> + webview.settings.javaScriptEnabled = true + webview.settings.setSupportZoom(true) + webview.settings.builtInZoomControls = true + webview.settings.displayZoomControls = false + webview.settings.loadWithOverviewMode = true + webview.settings.useWideViewPort = true + } + ) + } + } + } + } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorDefaults.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorDefaults.kt new file mode 100644 index 0000000000..aaecf82d48 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorDefaults.kt @@ -0,0 +1,9 @@ +package org.readium.navigator.web.preferences + +import org.readium.r2.navigator.preferences.ReadingProgression +import org.readium.r2.shared.ExperimentalReadiumApi + +@ExperimentalReadiumApi +public data class NavigatorDefaults( + val readingProgression: ReadingProgression? = null +) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferences.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferences.kt new file mode 100644 index 0000000000..b8707de68b --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferences.kt @@ -0,0 +1,21 @@ +package org.readium.navigator.web.preferences + +import kotlinx.serialization.Serializable +import org.readium.r2.navigator.preferences.Configurable +import org.readium.r2.navigator.preferences.Fit +import org.readium.r2.navigator.preferences.ReadingProgression +import org.readium.r2.shared.ExperimentalReadiumApi + +@Serializable +@ExperimentalReadiumApi +public data class NavigatorPreferences( + val fit: Fit? = null, + val readingProgression: ReadingProgression? = null +) : Configurable.Preferences { + + override operator fun plus(other: NavigatorPreferences): NavigatorPreferences = + NavigatorPreferences( + fit = other.fit ?: fit, + readingProgression = other.readingProgression ?: readingProgression + ) +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesEditor.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesEditor.kt new file mode 100644 index 0000000000..713909eb14 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesEditor.kt @@ -0,0 +1,72 @@ +/* + * Copyright 2022 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +package org.readium.navigator.web.preferences + +import org.readium.r2.navigator.preferences.* +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.InternalReadiumApi +import org.readium.r2.shared.publication.Metadata + +/** + * Interactive editor of [NavigatorPreferences]. + * + * This can be used as a view model for a user preferences screen. + * + * @see NavigatorPreferences + */ +@ExperimentalReadiumApi +@OptIn(InternalReadiumApi::class) +public class NavigatorPreferencesEditor internal constructor( + initialPreferences: NavigatorPreferences, + publicationMetadata: Metadata, + defaults: NavigatorDefaults +) : PreferencesEditor { + + private data class State( + val preferences: NavigatorPreferences, + val settings: NavigatorSettings + ) + + private val settingsResolver: NavigatorSettingsResolver = + NavigatorSettingsResolver(publicationMetadata, defaults) + + private var state: State = + initialPreferences.toState() + + override val preferences: NavigatorPreferences + get() = state.preferences + + override fun clear() { + updateValues { NavigatorPreferences() } + } + + public val fit: EnumPreference = + EnumPreferenceDelegate( + getValue = { preferences.fit }, + getEffectiveValue = { state.settings.fit }, + getIsEffective = { true }, + updateValue = { value -> updateValues { it.copy(fit = value) } }, + supportedValues = listOf(Fit.CONTAIN, Fit.WIDTH, Fit.HEIGHT, Fit.COVER) + ) + + public val readingProgression: EnumPreference = + EnumPreferenceDelegate( + getValue = { preferences.readingProgression }, + getEffectiveValue = { state.settings.readingProgression }, + getIsEffective = { true }, + updateValue = { value -> updateValues { it.copy(readingProgression = value) } }, + supportedValues = listOf(ReadingProgression.LTR, ReadingProgression.RTL) + ) + + private fun updateValues(updater: (NavigatorPreferences) -> NavigatorPreferences) { + val newPreferences = updater(preferences) + state = newPreferences.toState() + } + + private fun NavigatorPreferences.toState() = + State(preferences = this, settings = settingsResolver.settings(this)) +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesFilters.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesFilters.kt new file mode 100644 index 0000000000..158300933a --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesFilters.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2022 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +package org.readium.navigator.web.preferences + +import org.readium.r2.navigator.preferences.PreferencesFilter +import org.readium.r2.shared.ExperimentalReadiumApi + +/** + * Suggested filter to keep only shared [NavigatorPreferences]. + */ +@ExperimentalReadiumApi +public object NavigatorSharedPreferencesFilter : PreferencesFilter { + + override fun filter(preferences: NavigatorPreferences): NavigatorPreferences = + preferences.copy( + readingProgression = null + ) +} + +/** + * Suggested filter to keep only publication-specific [NavigatorPreferences]. + */ +@ExperimentalReadiumApi +public object NavigatorPublicationPreferencesFilter : PreferencesFilter { + + override fun filter(preferences: NavigatorPreferences): NavigatorPreferences = + NavigatorPreferences( + readingProgression = preferences.readingProgression + ) +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettings.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettings.kt new file mode 100644 index 0000000000..81d4b43f34 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettings.kt @@ -0,0 +1,12 @@ +package org.readium.navigator.web.preferences + +import org.readium.r2.navigator.preferences.Configurable +import org.readium.r2.navigator.preferences.Fit +import org.readium.r2.navigator.preferences.ReadingProgression +import org.readium.r2.shared.ExperimentalReadiumApi + +@ExperimentalReadiumApi +public data class NavigatorSettings( + val fit: Fit, + val readingProgression: ReadingProgression +) : Configurable.Settings diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettingsResolver.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettingsResolver.kt new file mode 100644 index 0000000000..2e54774e42 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettingsResolver.kt @@ -0,0 +1,33 @@ +package org.readium.navigator.web.preferences + +import org.readium.r2.navigator.preferences.Fit +import org.readium.r2.navigator.preferences.ReadingProgression +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.Metadata +import org.readium.r2.shared.publication.ReadingProgression as PublicationReadingProgression + +@ExperimentalReadiumApi +internal class NavigatorSettingsResolver( + private val metadata: Metadata, + private val defaults: NavigatorDefaults +) { + + fun settings(preferences: NavigatorPreferences): NavigatorSettings { + val readingProgression: ReadingProgression = + preferences.readingProgression + ?: when (metadata.readingProgression) { + PublicationReadingProgression.LTR -> ReadingProgression.LTR + PublicationReadingProgression.RTL -> ReadingProgression.RTL + else -> null + } ?: defaults.readingProgression + ?: ReadingProgression.LTR + + val fit: Fit = + preferences.fit ?: Fit.CONTAIN + + return NavigatorSettings( + fit = fit, + readingProgression = readingProgression + ) + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/ComposeWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/ComposeWebView.kt new file mode 100644 index 0000000000..7b2fda603a --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/ComposeWebView.kt @@ -0,0 +1,747 @@ +/* + * Copyright 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.readium.navigator.web.util + +import android.content.Context +import android.graphics.Bitmap +import android.os.Bundle +import android.view.ViewGroup.LayoutParams +import android.webkit.WebChromeClient +import android.webkit.WebResourceError +import android.webkit.WebResourceRequest +import android.webkit.WebView +import android.webkit.WebViewClient +import android.widget.FrameLayout +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.Stable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.Saver +import androidx.compose.runtime.saveable.mapSaver +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.runtime.snapshotFlow +import androidx.compose.runtime.snapshots.SnapshotStateList +import androidx.compose.ui.Modifier +import androidx.compose.ui.viewinterop.AndroidView +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +/** + * A wrapper around the Android View WebView to provide a basic WebView composable. + * + * If you require more customisation you are most likely better rolling your own and using this + * wrapper as an example. + * + * The WebView attempts to set the layoutParams based on the Compose modifier passed in. If it + * is incorrectly sizing, use the layoutParams composable function instead. + * + * @param state The webview state holder where the Uri to load is defined. + * @param modifier A compose modifier + * @param captureBackPresses Set to true to have this Composable capture back presses and navigate + * the WebView back. + * @param navigator An optional navigator object that can be used to control the WebView's + * navigation from outside the composable. + * @param onCreated Called when the WebView is first created, this can be used to set additional + * settings on the WebView. WebChromeClient and WebViewClient should not be set here as they will be + * subsequently overwritten after this lambda is called. + * @param onDispose Called when the WebView is destroyed. Provides a bundle which can be saved + * if you need to save and restore state in this WebView. + * @param client Provides access to WebViewClient via subclassing + * @param chromeClient Provides access to WebChromeClient via subclassing + * @param factory An optional WebView factory for using a custom subclass of WebView + */ +@Composable +internal fun WebView( + state: WebViewState, + modifier: Modifier = Modifier, + captureBackPresses: Boolean = true, + navigator: WebViewNavigator = rememberWebViewNavigator(), + onCreated: (WebView) -> Unit = {}, + onDispose: (WebView) -> Unit = {}, + client: AccompanistWebViewClient = remember { AccompanistWebViewClient() }, + chromeClient: AccompanistWebChromeClient = remember { AccompanistWebChromeClient() }, + factory: ((Context) -> WebView)? = null +) { + BoxWithConstraints(modifier) { + // WebView changes it's layout strategy based on + // it's layoutParams. We convert from Compose Modifier to + // layout params here. + val width = + if (constraints.hasFixedWidth) { + LayoutParams.MATCH_PARENT + } else { + LayoutParams.WRAP_CONTENT + } + val height = + if (constraints.hasFixedHeight) { + LayoutParams.MATCH_PARENT + } else { + LayoutParams.WRAP_CONTENT + } + + val layoutParams = FrameLayout.LayoutParams( + width, + height + ) + + WebView( + state, + layoutParams, + Modifier, + captureBackPresses, + navigator, + onCreated, + onDispose, + client, + chromeClient, + factory + ) + } +} + +/** + * A wrapper around the Android View WebView to provide a basic WebView composable. + * + * If you require more customisation you are most likely better rolling your own and using this + * wrapper as an example. + * + * The WebView attempts to set the layoutParams based on the Compose modifier passed in. If it + * is incorrectly sizing, use the layoutParams composable function instead. + * + * @param state The webview state holder where the Uri to load is defined. + * @param layoutParams A FrameLayout.LayoutParams object to custom size the underlying WebView. + * @param modifier A compose modifier + * @param captureBackPresses Set to true to have this Composable capture back presses and navigate + * the WebView back. + * @param navigator An optional navigator object that can be used to control the WebView's + * navigation from outside the composable. + * @param onCreated Called when the WebView is first created, this can be used to set additional + * settings on the WebView. WebChromeClient and WebViewClient should not be set here as they will be + * subsequently overwritten after this lambda is called. + * @param onDispose Called when the WebView is destroyed. Provides a bundle which can be saved + * if you need to save and restore state in this WebView. + * @param client Provides access to WebViewClient via subclassing + * @param chromeClient Provides access to WebChromeClient via subclassing + * @param factory An optional WebView factory for using a custom subclass of WebView + */ +@Composable +internal fun WebView( + state: WebViewState, + layoutParams: FrameLayout.LayoutParams, + modifier: Modifier = Modifier, + captureBackPresses: Boolean = true, + navigator: WebViewNavigator = rememberWebViewNavigator(), + onCreated: (WebView) -> Unit = {}, + onDispose: (WebView) -> Unit = {}, + client: AccompanistWebViewClient = remember { AccompanistWebViewClient() }, + chromeClient: AccompanistWebChromeClient = remember { AccompanistWebChromeClient() }, + factory: ((Context) -> WebView)? = null +) { + val webView = state.webView + + BackHandler(captureBackPresses && navigator.canGoBack) { + webView?.goBack() + } + + webView?.let { wv -> + LaunchedEffect(wv, navigator) { + with(navigator) { + wv.handleNavigationEvents() + } + } + + LaunchedEffect(wv, state) { + snapshotFlow { state.content }.collect { content -> + when (content) { + is WebContent.Url -> { + wv.loadUrl(content.url, content.additionalHttpHeaders) + } + + is WebContent.Data -> { + wv.loadDataWithBaseURL( + content.baseUrl, + content.data, + content.mimeType, + content.encoding, + content.historyUrl + ) + } + + is WebContent.Post -> { + wv.postUrl( + content.url, + content.postData + ) + } + + is WebContent.NavigatorOnly -> { + // NO-OP + } + } + } + } + } + + // Set the state of the client and chrome client + // This is done internally to ensure they always are the same instance as the + // parent Web composable + client.state = state + client.navigator = navigator + chromeClient.state = state + + AndroidView( + factory = { context -> + (factory?.invoke(context) ?: WebView(context)).apply { + onCreated(this) + + this.layoutParams = layoutParams + + state.viewState?.let { + this.restoreState(it) + } + + webChromeClient = chromeClient + webViewClient = client + }.also { state.webView = it } + }, + modifier = modifier, + onRelease = { + onDispose(it) + } + ) +} + +/** + * AccompanistWebViewClient + * + * A parent class implementation of WebViewClient that can be subclassed to add custom behaviour. + * + * As Accompanist Web needs to set its own web client to function, it provides this intermediary + * class that can be overridden if further custom behaviour is required. + */ +internal open class AccompanistWebViewClient : WebViewClient() { + internal open lateinit var state: WebViewState + internal set + internal open lateinit var navigator: WebViewNavigator + internal set + + override fun onPageStarted(view: WebView, url: String?, favicon: Bitmap?) { + super.onPageStarted(view, url, favicon) + state.loadingState = LoadingState.Loading(0.0f) + state.errorsForCurrentRequest.clear() + state.pageTitle = null + state.pageIcon = null + + state.lastLoadedUrl = url + } + + override fun onPageFinished(view: WebView, url: String?) { + super.onPageFinished(view, url) + state.loadingState = LoadingState.Finished + } + + override fun doUpdateVisitedHistory(view: WebView, url: String?, isReload: Boolean) { + super.doUpdateVisitedHistory(view, url, isReload) + + navigator.canGoBack = view.canGoBack() + navigator.canGoForward = view.canGoForward() + } + + override fun onReceivedError( + view: WebView, + request: WebResourceRequest?, + error: WebResourceError? + ) { + super.onReceivedError(view, request, error) + + if (error != null) { + state.errorsForCurrentRequest.add(WebViewError(request, error)) + } + } +} + +/** + * AccompanistWebChromeClient + * + * A parent class implementation of WebChromeClient that can be subclassed to add custom behaviour. + * + * As Accompanist Web needs to set its own web client to function, it provides this intermediary + * class that can be overridden if further custom behaviour is required. + */ +internal open class AccompanistWebChromeClient : WebChromeClient() { + internal open lateinit var state: WebViewState + internal set + + override fun onReceivedTitle(view: WebView, title: String?) { + super.onReceivedTitle(view, title) + state.pageTitle = title + } + + override fun onReceivedIcon(view: WebView, icon: Bitmap?) { + super.onReceivedIcon(view, icon) + state.pageIcon = icon + } + + override fun onProgressChanged(view: WebView, newProgress: Int) { + super.onProgressChanged(view, newProgress) + if (state.loadingState is LoadingState.Finished) return + state.loadingState = LoadingState.Loading(newProgress / 100.0f) + } +} + +internal sealed class WebContent { + internal data class Url( + val url: String, + val additionalHttpHeaders: Map = emptyMap() + ) : WebContent() + + internal data class Data( + val data: String, + val baseUrl: String? = null, + val encoding: String = "utf-8", + val mimeType: String? = null, + val historyUrl: String? = null + ) : WebContent() + + internal data class Post( + val url: String, + val postData: ByteArray + ) : WebContent() { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as Post + + if (url != other.url) return false + if (!postData.contentEquals(other.postData)) return false + + return true + } + + override fun hashCode(): Int { + var result = url.hashCode() + result = 31 * result + postData.contentHashCode() + return result + } + } + + internal data object NavigatorOnly : WebContent() +} + +internal fun WebContent.withUrl(url: String) = when (this) { + is WebContent.Url -> copy(url = url) + else -> WebContent.Url(url) +} + +/** + * Sealed class for constraining possible loading states. + * See [Loading] and [Finished]. + */ +internal sealed class LoadingState { + /** + * Describes a WebView that has not yet loaded for the first time. + */ + internal data object Initializing : LoadingState() + + /** + * Describes a webview between `onPageStarted` and `onPageFinished` events, contains a + * [progress] property which is updated by the webview. + */ + internal data class Loading(val progress: Float) : LoadingState() + + /** + * Describes a webview that has finished loading content. + */ + internal data object Finished : LoadingState() +} + +/** + * A state holder to hold the state for the WebView. In most cases this will be remembered + * using the rememberWebViewState(uri) function. + */ +@Stable +internal class WebViewState(webContent: WebContent) { + var lastLoadedUrl: String? by mutableStateOf(null) + internal set + + /** + * The content being loaded by the WebView + */ + var content: WebContent by mutableStateOf(webContent) + + /** + * Whether the WebView is currently [LoadingState.Loading] data in its main frame (along with + * progress) or the data loading has [LoadingState.Finished]. See [LoadingState] + */ + internal var loadingState: LoadingState by mutableStateOf(LoadingState.Initializing) + internal set + + /** + * Whether the webview is currently loading data in its main frame + */ + internal val isLoading: Boolean + get() = loadingState !is LoadingState.Finished + + /** + * The title received from the loaded content of the current page + */ + internal var pageTitle: String? by mutableStateOf(null) + internal set + + /** + * the favicon received from the loaded content of the current page + */ + internal var pageIcon: Bitmap? by mutableStateOf(null) + internal set + + /** + * A list for errors captured in the last load. Reset when a new page is loaded. + * Errors could be from any resource (iframe, image, etc.), not just for the main page. + * For more fine grained control use the OnError callback of the WebView. + */ + internal val errorsForCurrentRequest: SnapshotStateList = mutableStateListOf() + + /** + * The saved view state from when the view was destroyed last. To restore state, + * use the navigator and only call loadUrl if the bundle is null. + * See WebViewSaveStateSample. + */ + internal var viewState: Bundle? = null + internal set + + // We need access to this in the state saver. An internal DisposableEffect or AndroidView + // onDestroy is called after the state saver and so can't be used. + internal var webView by mutableStateOf(null) +} + +/** + * Allows control over the navigation of a WebView from outside the composable. E.g. for performing + * a back navigation in response to the user clicking the "up" button in a TopAppBar. + * + * @see [rememberWebViewNavigator] + */ +@Stable +internal class WebViewNavigator(private val coroutineScope: CoroutineScope) { + private sealed interface NavigationEvent { + data object Back : NavigationEvent + data object Forward : NavigationEvent + data object Reload : NavigationEvent + data object StopLoading : NavigationEvent + + data class LoadUrl( + val url: String, + val additionalHttpHeaders: Map = emptyMap() + ) : NavigationEvent + + data class LoadHtml( + val html: String, + val baseUrl: String? = null, + val mimeType: String? = null, + val encoding: String? = "utf-8", + val historyUrl: String? = null + ) : NavigationEvent + + data class PostUrl( + val url: String, + val postData: ByteArray + ) : NavigationEvent { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as PostUrl + + if (url != other.url) return false + if (!postData.contentEquals(other.postData)) return false + + return true + } + + override fun hashCode(): Int { + var result = url.hashCode() + result = 31 * result + postData.contentHashCode() + return result + } + } + } + + private val navigationEvents: MutableSharedFlow = MutableSharedFlow(replay = 1) + + // Use Dispatchers.Main to ensure that the webview methods are called on UI thread + internal suspend fun WebView.handleNavigationEvents(): Nothing = withContext(Dispatchers.Main) { + navigationEvents.collect { event -> + when (event) { + is NavigationEvent.Back -> goBack() + is NavigationEvent.Forward -> goForward() + is NavigationEvent.Reload -> reload() + is NavigationEvent.StopLoading -> stopLoading() + is NavigationEvent.LoadHtml -> loadDataWithBaseURL( + event.baseUrl, + event.html, + event.mimeType, + event.encoding, + event.historyUrl + ) + + is NavigationEvent.LoadUrl -> { + loadUrl(event.url, event.additionalHttpHeaders) + } + + is NavigationEvent.PostUrl -> { + postUrl(event.url, event.postData) + } + } + } + } + + /** + * True when the web view is able to navigate backwards, false otherwise. + */ + internal var canGoBack: Boolean by mutableStateOf(false) + internal set + + /** + * True when the web view is able to navigate forwards, false otherwise. + */ + internal var canGoForward: Boolean by mutableStateOf(false) + internal set + + internal fun loadUrl(url: String, additionalHttpHeaders: Map = emptyMap()) { + coroutineScope.launch { + navigationEvents.emit( + NavigationEvent.LoadUrl( + url, + additionalHttpHeaders + ) + ) + } + } + + internal fun loadHtml( + html: String, + baseUrl: String? = null, + mimeType: String? = null, + encoding: String? = "utf-8", + historyUrl: String? = null + ) { + coroutineScope.launch { + navigationEvents.emit( + NavigationEvent.LoadHtml( + html, + baseUrl, + mimeType, + encoding, + historyUrl + ) + ) + } + } + + internal fun postUrl( + url: String, + postData: ByteArray + ) { + coroutineScope.launch { + navigationEvents.emit( + NavigationEvent.PostUrl( + url, + postData + ) + ) + } + } + + /** + * Navigates the webview back to the previous page. + */ + internal fun navigateBack() { + coroutineScope.launch { navigationEvents.emit(NavigationEvent.Back) } + } + + /** + * Navigates the webview forward after going back from a page. + */ + internal fun navigateForward() { + coroutineScope.launch { navigationEvents.emit(NavigationEvent.Forward) } + } + + /** + * Reloads the current page in the webview. + */ + internal fun reload() { + coroutineScope.launch { navigationEvents.emit(NavigationEvent.Reload) } + } + + /** + * Stops the current page load (if one is loading). + */ + internal fun stopLoading() { + coroutineScope.launch { navigationEvents.emit(NavigationEvent.StopLoading) } + } +} + +/** + * Creates and remembers a [WebViewNavigator] using the default [CoroutineScope] or a provided + * override. + */ +@Composable +internal fun rememberWebViewNavigator( + coroutineScope: CoroutineScope = rememberCoroutineScope() +): WebViewNavigator = remember(coroutineScope) { WebViewNavigator(coroutineScope) } + +/** + * A wrapper class to hold errors from the WebView. + */ +@Immutable +internal data class WebViewError( + /** + * The request the error came from. + */ + val request: WebResourceRequest?, + /** + * The error that was reported. + */ + val error: WebResourceError +) + +/** + * Creates a WebView state that is remembered across Compositions. + * + * @param url The url to load in the WebView + * @param additionalHttpHeaders Optional, additional HTTP headers that are passed to [WebView.loadUrl]. + * Note that these headers are used for all subsequent requests of the WebView. + */ +@Composable +internal fun rememberWebViewState( + url: String, + additionalHttpHeaders: Map = emptyMap() +): WebViewState = +// Rather than using .apply {} here we will recreate the state, this prevents + // a recomposition loop when the webview updates the url itself. + remember { + WebViewState( + WebContent.Url( + url = url, + additionalHttpHeaders = additionalHttpHeaders + ) + ) + }.apply { + this.content = WebContent.Url( + url = url, + additionalHttpHeaders = additionalHttpHeaders + ) + } + +/** + * Creates a WebView state that is remembered across Compositions. + * + * @param data The uri to load in the WebView + */ +@Composable +internal fun rememberWebViewStateWithHTMLData( + data: String, + baseUrl: String? = null, + encoding: String = "utf-8", + mimeType: String? = null, + historyUrl: String? = null +): WebViewState = + remember { + WebViewState(WebContent.Data(data, baseUrl, encoding, mimeType, historyUrl)) + }.apply { + this.content = WebContent.Data( + data, + baseUrl, + encoding, + mimeType, + historyUrl + ) + } + +/** + * Creates a WebView state that is remembered across Compositions. + * + * @param url The url to load in the WebView + * @param postData The data to be posted to the WebView with the url + */ +@Composable +internal fun rememberWebViewState( + url: String, + postData: ByteArray +): WebViewState = +// Rather than using .apply {} here we will recreate the state, this prevents + // a recomposition loop when the webview updates the url itself. + remember { + WebViewState( + WebContent.Post( + url = url, + postData = postData + ) + ) + }.apply { + this.content = WebContent.Post( + url = url, + postData = postData + ) + } + +/** + * Creates a WebView state that is remembered across Compositions and saved + * across activity recreation. + * When using saved state, you cannot change the URL via recomposition. The only way to load + * a URL is via a WebViewNavigator. + */ +@Composable +internal fun rememberSaveableWebViewState(): WebViewState = + rememberSaveable(saver = WebStateSaver) { + WebViewState(WebContent.NavigatorOnly) + } + +internal val WebStateSaver: Saver = run { + val pageTitleKey = "pagetitle" + val lastLoadedUrlKey = "lastloaded" + val stateBundle = "bundle" + + mapSaver( + save = { + val viewState = Bundle().apply { it.webView?.saveState(this) } + mapOf( + pageTitleKey to it.pageTitle, + lastLoadedUrlKey to it.lastLoadedUrl, + stateBundle to viewState + ) + }, + restore = { + WebViewState(WebContent.NavigatorOnly).apply { + this.pageTitle = it[pageTitleKey] as String? + this.lastLoadedUrl = it[lastLoadedUrlKey] as String? + this.viewState = it[stateBundle] as Bundle? + } + } + ) +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewClient.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewClient.kt new file mode 100644 index 0000000000..576d69d85c --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewClient.kt @@ -0,0 +1,17 @@ +package org.readium.navigator.web.util + +import android.webkit.WebResourceRequest +import android.webkit.WebResourceResponse +import android.webkit.WebView + +internal class WebViewClient( + private val webViewServer: WebViewServer +) : AccompanistWebViewClient() { + + override fun shouldInterceptRequest( + view: WebView, + request: WebResourceRequest + ): WebResourceResponse? { + return webViewServer.shouldInterceptRequest(request) + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewServer.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewServer.kt new file mode 100644 index 0000000000..33508998e6 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewServer.kt @@ -0,0 +1,161 @@ +/* + * Copyright 2022 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +@file:OptIn(InternalReadiumApi::class) + +package org.readium.navigator.web.util + +import android.app.Application +import android.os.PatternMatcher +import android.webkit.WebResourceRequest +import android.webkit.WebResourceResponse +import androidx.webkit.WebViewAssetLoader +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.InternalReadiumApi +import org.readium.r2.shared.publication.Href +import org.readium.r2.shared.publication.Link +import org.readium.r2.shared.publication.Publication +import org.readium.r2.shared.util.AbsoluteUrl +import org.readium.r2.shared.util.Try +import org.readium.r2.shared.util.Url +import org.readium.r2.shared.util.data.ReadError +import org.readium.r2.shared.util.data.asInputStream +import org.readium.r2.shared.util.http.HttpHeaders +import org.readium.r2.shared.util.http.HttpRange +import org.readium.r2.shared.util.resource.Resource +import org.readium.r2.shared.util.resource.StringResource +import org.readium.r2.shared.util.resource.fallback + +/** + * Serves the publication resources and application assets in the EPUB navigator web views. + */ +@OptIn(ExperimentalReadiumApi::class) +internal class WebViewServer( + private val application: Application, + private val publication: Publication, + servedAssets: List, + private val disableSelectionWhenProtected: Boolean, + private val onResourceLoadFailed: (Url, ReadError) -> Unit +) { + companion object { + val publicationBaseHref = AbsoluteUrl("https://readium/publication/")!! + val assetsBaseHref = AbsoluteUrl("https://readium/assets/")!! + + fun assetUrl(path: String): Url? = + Url.fromDecodedPath(path)?.let { assetsBaseHref.resolve(it) } + } + + /** + * Serves the requests of the navigator web views. + * + * https://readium/publication/ serves the publication resources through its fetcher. + * https://readium/assets/ serves the application assets. + */ + fun shouldInterceptRequest(request: WebResourceRequest): WebResourceResponse? { + if (request.url.host != "readium") return null + val path = request.url.path ?: return null + + return when { + path.startsWith("/publication/") -> { + val href = Url.fromDecodedPath(path.removePrefix("/publication/")) + ?: return null + + servePublicationResource( + href = href, + range = HttpHeaders(request.requestHeaders).range + ) + } + path.startsWith("/assets/") && isServedAsset(path.removePrefix("/assets/")) -> { + assetsLoader.shouldInterceptRequest(request.url) + } + else -> null + } + } + + /** + * Returns a new [Resource] to serve the given [href] in the publication. + * + * If the [Resource] is an HTML document, injects the required JavaScript and CSS files. + */ + private fun servePublicationResource(href: Url, range: HttpRange?): WebResourceResponse { + val link = publication.linkWithHref(href) + // Query parameters must be kept as they might be relevant for the fetcher. + ?.copy(href = Href(href)) + ?: Link(href = href) + + // Drop anchor because it is meant to be interpreted by the client. + val urlWithoutAnchor = href.removeFragment() + + var resource = publication + .get(urlWithoutAnchor) + ?.fallback { + onResourceLoadFailed(urlWithoutAnchor, it) + errorResource() + } ?: run { + val error = ReadError.Decoding( + "Resource not found at $urlWithoutAnchor in publication." + ) + onResourceLoadFailed(urlWithoutAnchor, error) + errorResource() + } + + val headers = mutableMapOf( + "Accept-Ranges" to "bytes" + ) + + if (range == null) { + return WebResourceResponse( + link.mediaType?.toString(), + null, + 200, + "OK", + headers, + resource.asInputStream() + ) + } else { // Byte range request + val stream = resource.asInputStream() + val length = stream.available() + val longRange = range.toLongRange(length.toLong()) + headers["Content-Range"] = "bytes ${longRange.first}-${longRange.last}/$length" + // Content-Length will automatically be filled by the WebView using the Content-Range header. + // headers["Content-Length"] = (longRange.last - longRange.first + 1).toString() + // Weirdly, the WebView will call itself stream.skip to skip to the requested range. + return WebResourceResponse( + link.mediaType?.toString(), + null, + 206, + "Partial Content", + headers, + stream + ) + } + } + private fun errorResource(): Resource = + StringResource { + withContext(Dispatchers.IO) { + Try.success( + application.assets + .open("readium/error.xhtml") + .bufferedReader() + .use { it.readText() } + ) + } + } + + private fun isServedAsset(path: String): Boolean = + servedAssetPatterns.any { it.match(path) } + + private val servedAssetPatterns: List = + servedAssets.map { PatternMatcher(it, PatternMatcher.PATTERN_SIMPLE_GLOB) } + + private val assetsLoader = + WebViewAssetLoader.Builder() + .setDomain("readium") + .addPathHandler("/assets/", WebViewAssetLoader.AssetsPathHandler(application)) + .build() +} From 7ad7f729a61340eab962dae549758ed29b2491dc Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 10 Jul 2024 18:55:02 +0200 Subject: [PATCH 05/61] Can scroll and zoom --- readium/navigators/demo/build.gradle.kts | 1 + .../readium/navigator/demo/DemoActivity.kt | 10 +- .../readium/navigator/demo/DemoViewModel.kt | 5 + .../assets/readium/scripts/readium-fixed.js | 97 +++ .../readium/navigator/web/NavigatorFactory.kt | 2 +- .../readium/navigator/web/NavigatorView.kt | 28 +- .../navigator/web/util/ComposeWebView.kt | 52 +- .../navigator/web/util/GestureDetector.kt | 724 ++++++++++++++++++ .../navigator/web/util/HtmlInjector.kt | 72 ++ .../web/util/LoggingNestedScrollConnection.kt | 34 + .../navigator/web/util/LoggingWebView.kt | 124 +++ .../web/util/PointerDirectionConfig.kt | 49 ++ .../navigator/web/util/WebViewScroller.kt | 81 ++ .../navigator/web/util/WebViewServer.kt | 11 + 14 files changed, 1268 insertions(+), 22 deletions(-) create mode 100644 readium/navigators/web/src/main/assets/readium/scripts/readium-fixed.js create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/GestureDetector.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/HtmlInjector.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingNestedScrollConnection.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingWebView.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/PointerDirectionConfig.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScroller.kt diff --git a/readium/navigators/demo/build.gradle.kts b/readium/navigators/demo/build.gradle.kts index 80eb723283..19f322acba 100644 --- a/readium/navigators/demo/build.gradle.kts +++ b/readium/navigators/demo/build.gradle.kts @@ -65,6 +65,7 @@ dependencies { coreLibraryDesugaring(libs.desugar.jdk.libs) + implementation(libs.timber) implementation(libs.kotlinx.coroutines.android) implementation(libs.kotlin.stdlib) implementation(libs.androidx.legacy.v4) diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt index 5135eddfb5..d06d82bf2d 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt @@ -47,7 +47,10 @@ class DemoActivity : ComponentActivity() { ) { paddingValues -> Box( - modifier = Modifier.padding(paddingValues) + modifier = Modifier + .padding(paddingValues) + .fillMaxSize(), + propagateMinConstraints = true ) { val state = viewModel.state.collectAsState() @@ -65,7 +68,10 @@ class DemoActivity : ComponentActivity() { // Display nothing } is DemoViewModel.State.Reader -> { - NavigatorView(stateNow.state) + NavigatorView( + modifier = Modifier.fillMaxSize(), + state = stateNow.state + ) } } } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt index 7359498bd1..99d9e7f779 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt @@ -19,6 +19,7 @@ import org.readium.r2.shared.util.getOrElse import org.readium.r2.shared.util.http.DefaultHttpClient import org.readium.r2.streamer.PublicationOpener import org.readium.r2.streamer.parser.DefaultPublicationParser +import timber.log.Timber class DemoViewModel( application: Application @@ -41,6 +42,10 @@ class DemoViewModel( ) : State } + init { + Timber.plant(Timber.DebugTree()) + } + private val httpClient = DefaultHttpClient() diff --git a/readium/navigators/web/src/main/assets/readium/scripts/readium-fixed.js b/readium/navigators/web/src/main/assets/readium/scripts/readium-fixed.js new file mode 100644 index 0000000000..38b51a0ea2 --- /dev/null +++ b/readium/navigators/web/src/main/assets/readium/scripts/readium-fixed.js @@ -0,0 +1,97 @@ +window.addEventListener("DOMContentLoaded", function () { + bindDragGesture(document); +}); + +// See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling +function nearestInteractiveElement(element) { + if (element == null) { + return null; + } + var interactiveTags = [ + "a", + "audio", + "button", + "canvas", + "details", + "input", + "label", + "option", + "select", + "submit", + "textarea", + "video", + ]; + if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) { + return element.outerHTML; + } +} + +function bindDragGesture(element) { + // passive: false is necessary to be able to prevent the default behavior. + element.addEventListener("touchstart", onStart, { passive: false }); + element.addEventListener("touchend", onEnd, { passive: false }); + element.addEventListener("touchmove", onMove, { passive: false }); + + var state = undefined; + var isStartingDrag = false; + const pixelRatio = window.devicePixelRatio; + + function onStart(event) { + if (state) { + state = undefined; + isStartingDrag = false; + return; + } + + isStartingDrag = true; + + const startX = event.touches[0].clientX * pixelRatio; + const startY = event.touches[0].clientY * pixelRatio; + state = { + defaultPrevented: event.defaultPrevented, + startX: startX, + startY: startY, + currentX: startX, + currentY: startY, + offsetX: 0, + offsetY: 0, + interactiveElement: nearestInteractiveElement(event.target), + }; + } + + function onMove(event) { + if (!state) return; + + state.currentX = event.touches[0].clientX * pixelRatio; + state.currentY = event.touches[0].clientY * pixelRatio; + state.offsetX = state.currentX - state.startX; + state.offsetY = state.currentY - state.startY; + + var shouldPreventDefault = false; + // Wait for a movement of at least 6 pixels before reporting a drag. + if (isStartingDrag) { + if (Math.abs(state.offsetX) >= 6 || Math.abs(state.offsetY) >= 6) { + isStartingDrag = false; + shouldPreventDefault = Gestures.onDragStart(JSON.stringify(state)); + } + } else { + shouldPreventDefault = Gestures.onDragMove(JSON.stringify(state)); + } + + if (shouldPreventDefault) { + event.stopPropagation(); + event.preventDefault(); + } + } + + function onEnd(event) { + if (!state) return; + + const shouldPreventDefault = Gestures.onDragEnd(JSON.stringify(state)); + if (shouldPreventDefault) { + event.stopPropagation(); + event.preventDefault(); + } + state = undefined; + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt index 53685e1947..460e96a103 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt @@ -76,7 +76,7 @@ public class NavigatorFactory private constructor( WebViewServer( application = application, publication = publication, - servedAssets = emptyList(), + servedAssets = listOf("readium/.*"), disableSelectionWhenProtected = false, onResourceLoadFailed = { _, _ -> } ) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt index bd333e9706..cc44c71502 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt @@ -1,42 +1,60 @@ package org.readium.navigator.web import android.annotation.SuppressLint +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import org.readium.navigator.web.util.WebContent import org.readium.navigator.web.util.WebView import org.readium.navigator.web.util.WebViewServer -import org.readium.navigator.web.util.WebViewState +import org.readium.navigator.web.util.rememberWebViewState import org.readium.r2.shared.ExperimentalReadiumApi +import timber.log.Timber +@OptIn(ExperimentalFoundationApi::class) @SuppressLint("SetJavaScriptEnabled") @ExperimentalReadiumApi @Composable public fun NavigatorView( + modifier: Modifier, state: NavigatorState ) { - LazyRow { + val listState = rememberLazyListState() + val flingBehavior = rememberSnapFlingBehavior(lazyListState = listState) + + LazyRow( + modifier = modifier, + userScrollEnabled = true, + state = listState, + flingBehavior = flingBehavior + ) { items(state.spreads.value) { when (it) { is LayoutResolver.Spread.Double -> throw NotImplementedError() is LayoutResolver.Spread.Single -> { val url = WebViewServer.publicationBaseHref.resolve(it.url).toString() - val webContent = WebContent.Url(url) - val webViewState = WebViewState(webContent) + val webViewState = rememberWebViewState(url) WebView( modifier = Modifier.fillParentMaxSize(), state = webViewState, client = state.webViewClient, onCreated = { webview -> + Timber.d("WebView onCreate $url") webview.settings.javaScriptEnabled = true webview.settings.setSupportZoom(true) webview.settings.builtInZoomControls = true webview.settings.displayZoomControls = false webview.settings.loadWithOverviewMode = true webview.settings.useWideViewPort = true + webview.isVerticalScrollBarEnabled = false + webview.isHorizontalScrollBarEnabled = false + }, + onDispose = { + Timber.d("WebView onDispose $url") } ) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/ComposeWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/ComposeWebView.kt index 7b2fda603a..4c99bc1d52 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/ComposeWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/ComposeWebView.kt @@ -27,7 +27,10 @@ import android.webkit.WebView import android.webkit.WebViewClient import android.widget.FrameLayout import androidx.activity.compose.BackHandler +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.LazyRow import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.runtime.LaunchedEffect @@ -43,13 +46,18 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import androidx.compose.runtime.snapshots.SnapshotStateList +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.viewinterop.AndroidView +import androidx.core.view.ViewCompat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import org.readium.navigator.web.util.LoadingState.Finished +import org.readium.navigator.web.util.LoadingState.Loading +import timber.log.Timber /** * A wrapper around the Android View WebView to provide a basic WebView composable. @@ -87,7 +95,10 @@ internal fun WebView( chromeClient: AccompanistWebChromeClient = remember { AccompanistWebChromeClient() }, factory: ((Context) -> WebView)? = null ) { - BoxWithConstraints(modifier) { + BoxWithConstraints( + modifier = modifier, + propagateMinConstraints = true + ) { // WebView changes it's layout strategy based on // it's layoutParams. We convert from Compose Modifier to // layout params here. @@ -109,18 +120,29 @@ internal fun WebView( height ) - WebView( - state, - layoutParams, - Modifier, - captureBackPresses, - navigator, - onCreated, - onDispose, - client, - chromeClient, - factory - ) + Timber.d("layoutParams ${layoutParams.width} ${layoutParams.height}") + + LazyRow( + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically, + userScrollEnabled = false, + modifier = Modifier.fillMaxSize() + ) { + item { + WebView( + state, + layoutParams, + Modifier.fillParentMaxSize(), + captureBackPresses, + navigator, + onCreated, + onDispose, + client, + chromeClient, + factory + ) + } + } } } @@ -179,6 +201,7 @@ internal fun WebView( snapshotFlow { state.content }.collect { content -> when (content) { is WebContent.Url -> { + Timber.d("Loading URL ${content.url}") wv.loadUrl(content.url, content.additionalHttpHeaders) } @@ -216,8 +239,9 @@ internal fun WebView( AndroidView( factory = { context -> - (factory?.invoke(context) ?: WebView(context)).apply { + (factory?.invoke(context) ?: LoggingWebView(context)).apply { onCreated(this) + ViewCompat.setNestedScrollingEnabled(this, true) this.layoutParams = layoutParams diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/GestureDetector.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/GestureDetector.kt new file mode 100644 index 0000000000..4a95111150 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/GestureDetector.kt @@ -0,0 +1,724 @@ +/* +@file:OptIn(InternalReadiumApi::class) + +package org.readium.navigator.web.util + +import android.content.Context +import android.graphics.PointF +import android.os.Handler +import android.os.Message +import android.os.StrictMode +import android.view.GestureDetector +import android.view.MotionEvent +import android.view.VelocityTracker +import android.view.ViewConfiguration +import kotlin.math.abs +import org.json.JSONObject +import org.readium.r2.shared.InternalReadiumApi +import org.readium.r2.shared.extensions.optNullableString +import org.readium.r2.shared.extensions.tryOrNull +import timber.log.Timber + +internal class GestureDetectors( + private val contextClickListener: ContextClickListener? = null, + private val doubleTapListener: DoubleTapListener? = null, + private val gestureListener: GestureListener? = null +) { + + interface ContextClickListener { + + fun onContextClick() + } + + interface DoubleTapListener { + + fun onDoubleTap() + + fun onDoubleTapEvent() + + fun onSignelTapConfirmed() + } + + interface GestureListener { + + fun onDown() + + fun onFling(velocityX: Float, velocityY: Float) + + fun onScroll(distanceX: Float, distanceY: Float) + } + + @UnsupportedAppUsage + private var mTouchSlopSquare = 0 + private var mDoubleTapTouchSlopSquare = 0 + private var mDoubleTapSlopSquare = 0 + private var mAmbiguousGestureMultiplier = 0f + + @UnsupportedAppUsage + private var mMinimumFlingVelocity = 0 + private var mMaximumFlingVelocity = 0 + + private var mHandler: Handler? = null + + private var mStillDown = false + private var mDeferConfirmSingleTap = false + private var mInLongPress = false + private var mInContextClick = false + + @UnsupportedAppUsage + private var mAlwaysInTapRegion = false + private var mAlwaysInBiggerTapRegion = false + private var mIgnoreNextUpEvent = false + + // Whether a classification has been recorded by statsd for the current event stream. Reset on + // ACTION_DOWN. + private var mHasRecordedClassification = false + + private var mCurrentDownEvent: MotionEvent? = null + private var mCurrentMotionEvent: MotionEvent? = null + private var mPreviousUpEvent: MotionEvent? = null + + */ +/** + * True when the user is still touching for the second tap (down, move, and + * up events). Can only be true if there is a double tap listener attached. + *//* + + private var mIsDoubleTapping = false + + private var mLastFocusX = 0f + private var mLastFocusY = 0f + private var mDownFocusX = 0f + private var mDownFocusY = 0f + + */ +/** + * @return true if longpress is enabled, else false. + *//* + + */ +/** + * Set whether longpress is enabled, if this is enabled when a user + * presses and holds down you get a longpress event and nothing further. + * If it's disabled the user can press and hold down and then later + * moved their finger and you will get scroll events. By default + * longpress is enabled. + * + * @param isLongpressEnabled whether longpress should be enabled. + *//* + + var isLongpressEnabled: Boolean = false + + */ +/** + * Determines speed during touch scrolling + *//* + + private var mVelocityTracker: VelocityTracker? = null + + */ +/** + * Consistency verifier for debugging purposes. + *//* + + private val mInputEventConsistencyVerifier: InputEventConsistencyVerifier? = + if (InputEventConsistencyVerifier.isInstrumentationEnabled()) InputEventConsistencyVerifier( + this, 0 + ) else null + + private inner class GestureHandler : Handler { + + constructor(handler: Handler) : super(handler.looper) + + override fun handleMessage(msg: Message) { + when (msg.what) { + android.view.GestureDetector.Companion.SHOW_PRESS -> mListener!!.onShowPress( + mCurrentDownEvent!! + ) + + android.view.GestureDetector.Companion.LONG_PRESS -> { + recordGestureClassification(msg.arg1) + dispatchLongPress() + } + + android.view.GestureDetector.Companion.TAP -> // If the user's finger is still down, do not count it as a tap + if (mDoubleTapListener != null) { + if (!mStillDown) { + recordGestureClassification( + TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__SINGLE_TAP + ) + mDoubleTapListener!!.onSingleTapConfirmed(mCurrentDownEvent!!) + } else { + mDeferConfirmSingleTap = true + } + } + + else -> throw RuntimeException("Unknown message $msg") //never + + } + } + } + + init { + if (handler != null) { + mHandler = GestureHandler(handler) + } else { + mHandler = GestureHandler() + } + mListener = listener + if (listener is android.view.GestureDetector.OnDoubleTapListener) { + setOnDoubleTapListener(listener as android.view.GestureDetector.OnDoubleTapListener) + } + if (listener is android.view.GestureDetector.OnContextClickListener) { + setContextClickListener(listener as android.view.GestureDetector.OnContextClickListener) + } + init(context) + } + + private fun init(@UiContext context: Context?) { + if (mListener == null) { + throw NullPointerException("OnGestureListener must not be null") + } + isLongpressEnabled = true + + // Fallback to support pre-donuts releases + val touchSlop: Int + val doubleTapSlop: Int + val doubleTapTouchSlop: Int + if (context == null) { + touchSlop = ViewConfiguration.getTouchSlop() + doubleTapTouchSlop = touchSlop // Hack rather than adding a hidden method for this + doubleTapSlop = ViewConfiguration.getDoubleTapSlop() + mMinimumFlingVelocity = ViewConfiguration.getMinimumFlingVelocity() + mMaximumFlingVelocity = ViewConfiguration.getMaximumFlingVelocity() + mAmbiguousGestureMultiplier = ViewConfiguration.getAmbiguousGestureMultiplier() + } else { + StrictMode.assertConfigurationContext(context, "GestureDetector#init") + val configuration = ViewConfiguration.get(context) + touchSlop = configuration.scaledTouchSlop + doubleTapTouchSlop = configuration.getScaledDoubleTapTouchSlop() + doubleTapSlop = configuration.scaledDoubleTapSlop + mMinimumFlingVelocity = configuration.scaledMinimumFlingVelocity + mMaximumFlingVelocity = configuration.scaledMaximumFlingVelocity + mAmbiguousGestureMultiplier = configuration.scaledAmbiguousGestureMultiplier + } + mTouchSlopSquare = touchSlop * touchSlop + mDoubleTapTouchSlopSquare = doubleTapTouchSlop * doubleTapTouchSlop + mDoubleTapSlopSquare = doubleTapSlop * doubleTapSlop + } + + */ +/** + * Analyzes the given motion event and if applicable triggers the + * appropriate callbacks on the [OnGestureListener] supplied. + * + * @param ev The current motion event. + * @return true if the [OnGestureListener] consumed the event, + * else false. + *//* + + fun onTouchEvent(ev: MotionEvent): Boolean { + val action = ev.action + + if (mCurrentMotionEvent != null) { + mCurrentMotionEvent!!.recycle() + } + mCurrentMotionEvent = MotionEvent.obtain(ev) + + if (mVelocityTracker == null) { + mVelocityTracker = VelocityTracker.obtain() + } + mVelocityTracker!!.addMovement(ev) + + val pointerUp = + (action and MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_UP + val skipIndex = if (pointerUp) ev.actionIndex else -1 + val isGeneratedGesture = + (ev.flags and MotionEvent.FLAG_IS_GENERATED_GESTURE) !== 0 + + // Determine focal point + var sumX = 0f + var sumY = 0f + val count = ev.pointerCount + for (i in 0 until count) { + if (skipIndex == i) continue + sumX += ev.getX(i) + sumY += ev.getY(i) + } + val div = if (pointerUp) count - 1 else count + val focusX = sumX / div + val focusY = sumY / div + + var handled = false + + when (action and MotionEvent.ACTION_MASK) { + MotionEvent.ACTION_POINTER_DOWN -> { + run { + mLastFocusX = focusX + mDownFocusX = mLastFocusX + } + run { + mLastFocusY = focusY + mDownFocusY = mLastFocusY + } + // Cancel long press and taps + cancelTaps() + } + + MotionEvent.ACTION_POINTER_UP -> { + run { + mLastFocusX = focusX + mDownFocusX = mLastFocusX + } + run { + mLastFocusY = focusY + mDownFocusY = mLastFocusY + } + // Check the dot product of current velocities. + // If the pointer that left was opposing another velocity vector, clear. + mVelocityTracker!!.computeCurrentVelocity(1000, mMaximumFlingVelocity.toFloat()) + val upIndex = ev.actionIndex + val id1 = ev.getPointerId(upIndex) + val x1 = mVelocityTracker!!.getXVelocity(id1) + val y1 = mVelocityTracker!!.getYVelocity(id1) + var i = 0 + while (i < count) { + if (i == upIndex) { + i++ + continue + } + + val id2 = ev.getPointerId(i) + val x = x1 * mVelocityTracker!!.getXVelocity(id2) + val y = y1 * mVelocityTracker!!.getYVelocity(id2) + + val dot = x + y + if (dot < 0) { + mVelocityTracker!!.clear() + break + } + i++ + } + } + + MotionEvent.ACTION_DOWN -> { + if (doubleTapListener != null) { + val hadTapMessage = + mHandler!!.hasMessages(TAP) + if (hadTapMessage) mHandler!!.removeMessages(TAP) + if ((mCurrentDownEvent != null) && (mPreviousUpEvent != null) + && hadTapMessage + && isConsideredDoubleTap(mCurrentDownEvent!!, mPreviousUpEvent!!, ev) + ) { + // This is a second tap + mIsDoubleTapping = true + // Give a callback with the first tap of the double-tap + handled = + handled or doubleTapListener.onDoubleTap(mCurrentDownEvent!!) + // Give a callback with down event of the double-tap + handled = handled or doubleTapListener.onDoubleTapEvent(ev) + } else { + // This is a first tap + mHandler!!.sendEmptyMessageDelayed( + TAP, + DOUBLE_TAP_TIMEOUT.toLong() + ) + } + } + + mLastFocusX = focusX + mDownFocusX = mLastFocusX + + mLastFocusY = focusY + mDownFocusY = mLastFocusY + + if (mCurrentDownEvent != null) { + mCurrentDownEvent!!.recycle() + } + mCurrentDownEvent = MotionEvent.obtain(ev) + mAlwaysInTapRegion = true + mAlwaysInBiggerTapRegion = true + mStillDown = true + mInLongPress = false + mDeferConfirmSingleTap = false + mHasRecordedClassification = false + + if (isLongpressEnabled) { + mHandler!!.removeMessages(LONG_PRESS) + mHandler!!.sendMessageAtTime( + mHandler!!.obtainMessage( + LONG_PRESS, + TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__LONG_PRESS, + 0 */ +/* arg2 *//* + + ), + mCurrentDownEvent.getDownTime() + + ViewConfiguration.getLongPressTimeout() + ) + } + mHandler!!.sendEmptyMessageAtTime( + SHOW_PRESS, + mCurrentDownEvent.getDownTime() + TAP_TIMEOUT + ) + handled = handled or mListener!!.onDown(ev) + } + + MotionEvent.ACTION_MOVE -> { + if (mInLongPress || mInContextClick) { + break + } + + val motionClassification = ev.classification + val hasPendingLongPress = + mHandler!!.hasMessages(LONG_PRESS) + + val scrollX = mLastFocusX - focusX + val scrollY = mLastFocusY - focusY + if (mIsDoubleTapping) { + // Give the move events of the double-tap + recordGestureClassification( + TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__DOUBLE_TAP + ) + handled = handled or doubleTapListener.onDoubleTapEvent(ev) + } else if (mAlwaysInTapRegion) { + val deltaX = (focusX - mDownFocusX).toInt() + val deltaY = (focusY - mDownFocusY).toInt() + val distance = (deltaX * deltaX) + (deltaY * deltaY) + var slopSquare = if (isGeneratedGesture) 0 else mTouchSlopSquare + + val ambiguousGesture = + motionClassification == MotionEvent.CLASSIFICATION_AMBIGUOUS_GESTURE + val shouldInhibitDefaultAction = + hasPendingLongPress && ambiguousGesture + if (shouldInhibitDefaultAction) { + // Inhibit default long press + if (distance > slopSquare) { + // The default action here is to remove long press. But if the touch + // slop below gets increased, and we never exceed the modified touch + // slop while still receiving AMBIGUOUS_GESTURE, we risk that *nothing* + // will happen in response to user input. To prevent this, + // reschedule long press with a modified timeout. + mHandler!!.removeMessages(LONG_PRESS) + val longPressTimeout = + ViewConfiguration.getLongPressTimeout().toLong() + mHandler!!.sendMessageAtTime( + mHandler!!.obtainMessage( + LONG_PRESS, + TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__LONG_PRESS, + 0 */ +/* arg2 *//* + + ), + (ev.downTime + + (longPressTimeout * mAmbiguousGestureMultiplier).toLong()) + ) + } + // Inhibit default scroll. If a gesture is ambiguous, we prevent scroll + // until the gesture is resolved. + // However, for safety, simply increase the touch slop in case the + // classification is erroneous. Since the value is squared, multiply twice. + slopSquare = + (slopSquare * (mAmbiguousGestureMultiplier * mAmbiguousGestureMultiplier)).toInt() + } + + if (distance > slopSquare) { + recordGestureClassification( + TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__SCROLL + ) + handled = mListener!!.onScroll(mCurrentDownEvent, ev, scrollX, scrollY) + mLastFocusX = focusX + mLastFocusY = focusY + mAlwaysInTapRegion = false + mHandler!!.removeMessages(TAP) + mHandler!!.removeMessages(SHOW_PRESS) + mHandler!!.removeMessages(LONG_PRESS) + } + val doubleTapSlopSquare = + if (isGeneratedGesture) 0 else mDoubleTapTouchSlopSquare + if (distance > doubleTapSlopSquare) { + mAlwaysInBiggerTapRegion = false + } + } else if ((abs(scrollX.toDouble()) >= 1) || (abs(scrollY.toDouble()) >= 1)) { + recordGestureClassification(TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__SCROLL) + handled = mListener!!.onScroll(mCurrentDownEvent, ev, scrollX, scrollY) + mLastFocusX = focusX + mLastFocusY = focusY + } + val deepPress = + motionClassification == MotionEvent.CLASSIFICATION_DEEP_PRESS + if (deepPress && hasPendingLongPress) { + mHandler!!.removeMessages(LONG_PRESS) + mHandler!!.sendMessage( + mHandler!!.obtainMessage( + LONG_PRESS, + TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__DEEP_PRESS, + 0 */ +/* arg2 *//* + + ) + ) + } + } + + MotionEvent.ACTION_UP -> { + mStillDown = false + val currentUpEvent = MotionEvent.obtain(ev) + if (mIsDoubleTapping) { + // Finally, give the up event of the double-tap + recordGestureClassification( + TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__DOUBLE_TAP + ) + handled = handled or mDoubleTapListener!!.onDoubleTapEvent(ev) + } else if (mInLongPress) { + mHandler!!.removeMessages(android.view.GestureDetector.Companion.TAP) + mInLongPress = false + } else if (mAlwaysInTapRegion && !mIgnoreNextUpEvent) { + recordGestureClassification( + TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__SINGLE_TAP + ) + handled = mListener!!.onSingleTapUp(ev) + if (mDeferConfirmSingleTap && mDoubleTapListener != null) { + mDoubleTapListener!!.onSingleTapConfirmed(ev) + } + } else if (!mIgnoreNextUpEvent) { + // A fling must travel the minimum tap distance + + val velocityTracker = mVelocityTracker + val pointerId = ev.getPointerId(0) + velocityTracker!!.computeCurrentVelocity( + 1000, + mMaximumFlingVelocity.toFloat() + ) + val velocityY = velocityTracker.getYVelocity(pointerId) + val velocityX = velocityTracker.getXVelocity(pointerId) + + if (((abs(velocityY.toDouble()) > mMinimumFlingVelocity) + || (abs(velocityX.toDouble()) > mMinimumFlingVelocity)) + ) { + handled = + mListener!!.onFling(mCurrentDownEvent, ev, velocityX, velocityY) + } + } + if (mPreviousUpEvent != null) { + mPreviousUpEvent!!.recycle() + } + // Hold the event we obtained above - listeners may have changed the original. + mPreviousUpEvent = currentUpEvent + if (mVelocityTracker != null) { + // This may have been cleared when we called out to the + // application above. + mVelocityTracker!!.recycle() + mVelocityTracker = null + } + mIsDoubleTapping = false + mDeferConfirmSingleTap = false + mIgnoreNextUpEvent = false + mHandler!!.removeMessages(android.view.GestureDetector.Companion.SHOW_PRESS) + mHandler!!.removeMessages(android.view.GestureDetector.Companion.LONG_PRESS) + } + + MotionEvent.ACTION_CANCEL -> cancel() + } + if (!handled && mInputEventConsistencyVerifier != null) { + mInputEventConsistencyVerifier.onUnhandledEvent(ev, 0) + } + return handled + } + + fun onTouchStart() { + + } + + fun onTouchMove() { + + } + + fun onTouchEnd() { + + } + + */ +/** + * Analyzes the given generic motion event and if applicable triggers the + * appropriate callbacks on the [OnGestureListener] supplied. + * + * @param ev The current motion event. + * @return true if the [OnGestureListener] consumed the event, + * else false. + *//* + + fun onGenericMotionEvent(ev: MotionEvent): Boolean { + if (mInputEventConsistencyVerifier != null) { + mInputEventConsistencyVerifier.onGenericMotionEvent(ev, 0) + } + + val actionButton = ev.actionButton + when (ev.actionMasked) { + MotionEvent.ACTION_BUTTON_PRESS -> if (((mContextClickListener != null) && !mInContextClick && !mInLongPress + && ((actionButton == MotionEvent.BUTTON_STYLUS_PRIMARY + || actionButton == MotionEvent.BUTTON_SECONDARY))) + ) { + if (mContextClickListener!!.onContextClick(ev)) { + mInContextClick = true + mHandler!!.removeMessages(android.view.GestureDetector.Companion.LONG_PRESS) + mHandler!!.removeMessages(android.view.GestureDetector.Companion.TAP) + return true + } + } + + MotionEvent.ACTION_BUTTON_RELEASE -> if (mInContextClick && ((actionButton == MotionEvent.BUTTON_STYLUS_PRIMARY + || actionButton == MotionEvent.BUTTON_SECONDARY)) + ) { + mInContextClick = false + mIgnoreNextUpEvent = true + } + } + return false + } + + private fun cancel() { + mHandler!!.removeMessages(android.view.GestureDetector.Companion.SHOW_PRESS) + mHandler!!.removeMessages(android.view.GestureDetector.Companion.LONG_PRESS) + mHandler!!.removeMessages(android.view.GestureDetector.Companion.TAP) + mVelocityTracker!!.recycle() + mVelocityTracker = null + mIsDoubleTapping = false + mStillDown = false + mAlwaysInTapRegion = false + mAlwaysInBiggerTapRegion = false + mDeferConfirmSingleTap = false + mInLongPress = false + mInContextClick = false + mIgnoreNextUpEvent = false + } + + private fun cancelTaps() { + mHandler!!.removeMessages(android.view.GestureDetector.Companion.SHOW_PRESS) + mHandler!!.removeMessages(android.view.GestureDetector.Companion.LONG_PRESS) + mHandler!!.removeMessages(android.view.GestureDetector.Companion.TAP) + mIsDoubleTapping = false + mAlwaysInTapRegion = false + mAlwaysInBiggerTapRegion = false + mDeferConfirmSingleTap = false + mInLongPress = false + mInContextClick = false + mIgnoreNextUpEvent = false + } + + private fun isConsideredDoubleTap( + firstDown: MotionEvent, + firstUp: MotionEvent, secondDown: MotionEvent + ): Boolean { + if (!mAlwaysInBiggerTapRegion) { + return false + } + + val deltaTime = secondDown.eventTime - firstUp.eventTime + if (deltaTime > android.view.GestureDetector.Companion.DOUBLE_TAP_TIMEOUT || deltaTime < android.view.GestureDetector.Companion.DOUBLE_TAP_MIN_TIME) { + return false + } + + val deltaX = firstDown.x.toInt() - secondDown.x.toInt() + val deltaY = firstDown.y.toInt() - secondDown.y.toInt() + val isGeneratedGesture = + (firstDown.flags and MotionEvent.FLAG_IS_GENERATED_GESTURE) !== 0 + val slopSquare = if (isGeneratedGesture) 0 else mDoubleTapSlopSquare + return (deltaX * deltaX + deltaY * deltaY < slopSquare) + } + + private fun dispatchLongPress() { + mHandler!!.removeMessages(TAP) + mDeferConfirmSingleTap = false + mInLongPress = true + mListener!!.onLongPress((mCurrentDownEvent)!!) + } + + companion object { + private val TAG: String = android.view.GestureDetector::class.java.simpleName + private val TAP_TIMEOUT = ViewConfiguration.getTapTimeout() + private val DOUBLE_TAP_TIMEOUT = ViewConfiguration.getDoubleTapTimeout() + private val DOUBLE_TAP_MIN_TIME: Int = 40 // ViewConfiguration.getDoubleTapMinTime() + + // constants for Message.what used by GestureHandler below + private val SHOW_PRESS = 1 + private val LONG_PRESS = 2 + private val TAP = 3 + } + + @Suppress("Unused_parameter") + @android.webkit.JavascriptInterface + fun onDragStart(eventJson: String): Boolean { + Timber.d("onDragStart $eventJson") + val event = DragEvent.fromJSON(eventJson)?.takeIf { it.isValid } + ?: return false + + } + + @Suppress("Unused_parameter") + @android.webkit.JavascriptInterface + fun onDragMove(eventJson: String): Boolean { + Timber.d("onDragMove $eventJson") + */ +/*val event = DragEvent.fromJSON(eventJson)?.takeIf { it.isValid } + ?: return false *//* + + + return true + } + + + @Suppress("Unused_parameter") + @android.webkit.JavascriptInterface + fun onDragEnd(eventJson: String): Boolean { + Timber.d("onDragEnd $eventJson") + val event = DragEvent.fromJSON(eventJson)?.takeIf { it.isValid } + ?: return false + + + return true + + } +} + +*/ +/** Produced by gestures.js *//* + +private data class DragEvent( + val defaultPrevented: Boolean, + val startPoint: PointF, + val currentPoint: PointF, + val offset: PointF, + val interactiveElement: String? +) { + internal val isValid: Boolean get() = + !defaultPrevented && (interactiveElement == null) + + companion object { + + fun fromJSONObject(obj: JSONObject?): DragEvent? { + obj ?: return null + + return DragEvent( + defaultPrevented = obj.optBoolean("defaultPrevented"), + startPoint = PointF( + obj.optDouble("startX").toFloat(), + obj.optDouble("startY").toFloat() + ), + currentPoint = PointF( + obj.optDouble("currentX").toFloat(), + obj.optDouble("currentY").toFloat() + ), + offset = PointF( + obj.optDouble("offsetX").toFloat(), + obj.optDouble("offsetY").toFloat() + ), + interactiveElement = obj.optNullableString("interactiveElement") + ) + } + + fun fromJSON(json: String): DragEvent? = + fromJSONObject(tryOrNull { JSONObject(json) }) + } +} +*/ diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/HtmlInjector.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/HtmlInjector.kt new file mode 100644 index 0000000000..db3ec1f5db --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/HtmlInjector.kt @@ -0,0 +1,72 @@ +/* + * Copyright 2022 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +package org.readium.navigator.web.util + +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.Publication +import org.readium.r2.shared.publication.services.isProtected +import org.readium.r2.shared.util.AbsoluteUrl +import org.readium.r2.shared.util.Try +import org.readium.r2.shared.util.Url +import org.readium.r2.shared.util.mediatype.MediaType +import org.readium.r2.shared.util.resource.Resource +import org.readium.r2.shared.util.resource.TransformingResource +import timber.log.Timber + +/** + * Injects scripts in the HTML [Resource] receiver. + * + * @param baseHref Base URL where and scripts are served. + */ +@OptIn(ExperimentalReadiumApi::class) +internal fun Resource.injectHtml( + publication: Publication, + mediaType: MediaType, + baseHref: AbsoluteUrl, + disableSelectionWhenProtected: Boolean +): Resource = + TransformingResource(this) { bytes -> + if (!mediaType.isHtml) { + return@TransformingResource Try.success(bytes) + } + + var content = bytes.toString(mediaType.charset ?: Charsets.UTF_8).trim() + val injectables = mutableListOf() + + injectables.add( + script(baseHref.resolve(Url("readium/scripts/readium-fixed.js")!!)) + ) + + // Disable the text selection if the publication is protected. + // FIXME: This is a hack until proper LCP copy is implemented, see https://github.com/readium/kotlin-toolkit/issues/221 + if (disableSelectionWhenProtected && publication.isProtected) { + injectables.add( + """ + + """ + ) + } + + val headEndIndex = content.indexOf("", 0, true) + if (headEndIndex == -1) { + Timber.e(" closing tag not found in resource with href: $sourceUrl") + } else { + content = StringBuilder(content) + .insert(headEndIndex, "\n" + injectables.joinToString("\n") + "\n") + .toString() + } + + Try.success(content.toByteArray()) + } + +private fun script(src: Url): String = + """""" diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingNestedScrollConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingNestedScrollConnection.kt new file mode 100644 index 0000000000..468d106b9b --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingNestedScrollConnection.kt @@ -0,0 +1,34 @@ +package org.readium.navigator.web.util + +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.input.nestedscroll.NestedScrollSource +import androidx.compose.ui.unit.Velocity +import timber.log.Timber + +internal class LoggingNestedScrollConnection : NestedScrollConnection { + + override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { + Timber.d("onPostFling $consumed $available") + return super.onPostFling(consumed, available) + } + + override fun onPostScroll( + consumed: Offset, + available: Offset, + source: NestedScrollSource + ): Offset { + Timber.d("onPostFling $consumed $available $source") + return super.onPostScroll(consumed, available, source) + } + + override suspend fun onPreFling(available: Velocity): Velocity { + Timber.d("onPreFling $available") + return super.onPreFling(available) + } + + override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { + Timber.d("onPreScroll $available $source") + return super.onPreScroll(available, source) + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingWebView.kt new file mode 100644 index 0000000000..5ea9dceedd --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingWebView.kt @@ -0,0 +1,124 @@ +package org.readium.navigator.web.util + +import android.annotation.SuppressLint +import android.content.Context +import android.view.MotionEvent +import android.view.ViewConfiguration +import android.webkit.WebView +import androidx.compose.ui.geometry.Offset +import kotlin.math.abs +import kotlin.math.sign +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import org.readium.r2.shared.InternalReadiumApi +import timber.log.Timber + +@OptIn(InternalReadiumApi::class) +internal class LoggingWebView(context: Context) : WebView(context) { + + private val coroutineScope: CoroutineScope = + CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) + + /*init { + val gestureDetector = GestureDetector() + addJavascriptInterface(gestureDetector, "Gestures") + }*/ + + data class State( + val downPosition: Offset, + val lastMoveDest: Offset? = null, + val cumulatedDelta: Offset = Offset.Zero + ) + + private val touchSlop = ViewConfiguration.get(context).scaledTouchSlop + + private var state: State? = null + + private val disallowInterceptTouchEvent: MutableStateFlow = + MutableStateFlow(false) + + init { + disallowInterceptTouchEvent + .onEach { + Timber.d( + if (it) { + "disallowIntercept" + } else { + "allowIntercept" + } + ) + requestDisallowInterceptTouchEvent(it) + } + .launchIn(coroutineScope) + } + + override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { + Timber.d("onInterceptTouchEvent $ev") + val res = super.onInterceptTouchEvent(ev) + // Timber.d("onInterceptTouchEvent $res $ev") + return res + } + + @SuppressLint("ClickableViewAccessibility") + override fun onTouchEvent(event: MotionEvent): Boolean { + Timber.d("onTouchEvent $event") + Timber.d("onTouchEvent ${disallowInterceptTouchEvent.value} $event") + + val eventOffset = Offset(event.x, event.y) + when (event.action) { + MotionEvent.ACTION_DOWN -> { + disallowInterceptTouchEvent.value = false + state = State(downPosition = eventOffset) + } + MotionEvent.ACTION_MOVE -> { + val currentMoveDelta = eventOffset - (state!!.lastMoveDest ?: state!!.downPosition) + val absCurrentMoveDelta = abs(currentMoveDelta) + val cumulatedDelta = state!!.cumulatedDelta + abs(eventOffset) + state = state!!.copy(lastMoveDest = eventOffset, cumulatedDelta = cumulatedDelta) + + val horizontalSign = -sign(currentMoveDelta.x).toInt() + val verticalSign = sign(currentMoveDelta.y).toInt() + + val shouldScrollHorizontally = + state!!.isHorizontallyScrolling() && canScrollHorizontally(horizontalSign) + + val shouldScrollVertically = + state!!.isVerticallyScrolling() && canScrollVertically(verticalSign) && + absCurrentMoveDelta.x < 2 * absCurrentMoveDelta.y + + disallowInterceptTouchEvent.value = shouldScrollHorizontally || shouldScrollVertically + } + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { + disallowInterceptTouchEvent.value = false + state = null + } + } + + val res = super.onTouchEvent(event) + // Timber.d("onTouchEvent $res $event") + return true + } + + private fun State.isVerticallyScrolling() = + cumulatedDelta.y > touchSlop + + private fun State.isHorizontallyScrolling() = + cumulatedDelta.x > touchSlop + + private fun abs(offset: Offset): Offset { + val absX = abs(offset.x) + val absY = abs(offset.y) + return Offset(absX, absY) + } + + override fun dispatchTouchEvent(ev: MotionEvent): Boolean { + Timber.d("dispatchTouchEvent $ev") + val res = super.dispatchTouchEvent(ev) + // Timber.d("dispatchTouchEvent $res $ev") + return res + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PointerDirectionConfig.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PointerDirectionConfig.kt new file mode 100644 index 0000000000..b5f3d7ae50 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PointerDirectionConfig.kt @@ -0,0 +1,49 @@ +package org.readium.navigator.web.util + +import androidx.compose.ui.geometry.Offset +import kotlin.math.abs +import kotlin.math.sign + +/** + * Configures the calculations to get the change amount depending on the dragging type. + * [calculatePostSlopOffset] will return the post offset slop when the touchSlop is reached. + */ +internal interface PointerDirectionConfig { + fun calculateDeltaChange(offset: Offset): Float + fun calculatePostSlopOffset( + totalPositionChange: Offset, + touchSlop: Float + ): Offset +} + +/** + * Used for monitoring changes on X axis. + */ +internal val HorizontalPointerDirectionConfig = object : PointerDirectionConfig { + override fun calculateDeltaChange(offset: Offset): Float = abs(offset.x) + + override fun calculatePostSlopOffset( + totalPositionChange: Offset, + touchSlop: Float + ): Offset { + val finalMainPositionChange = totalPositionChange.x - + (sign(totalPositionChange.x) * touchSlop) + return Offset(finalMainPositionChange, totalPositionChange.y) + } +} + +/** + * Used for monitoring changes on Y axis. + */ +internal val VerticalPointerDirectionConfig = object : PointerDirectionConfig { + override fun calculateDeltaChange(offset: Offset): Float = abs(offset.y) + + override fun calculatePostSlopOffset( + totalPositionChange: Offset, + touchSlop: Float + ): Offset { + val finalMainPositionChange = totalPositionChange.y - + (sign(totalPositionChange.y) * touchSlop) + return Offset(totalPositionChange.x, finalMainPositionChange) + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScroller.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScroller.kt new file mode 100644 index 0000000000..a04dbf4cb1 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScroller.kt @@ -0,0 +1,81 @@ +/* +package org.readium.navigator.web.util + +import android.content.Context +import android.graphics.Point +import android.os.Build +import android.webkit.WebView +import android.widget.OverScroller + +internal class WebViewScroller( + private val context: Context, + private val webview: WebView +) : GestureDetector.Listener { + + private val scroller = OverScroller(context) + + override fun onDown() { + // Initiates the decay phase of any active edge effects. + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { + releaseEdgeEffects() + } + + // Aborts any active scroll animations and invalidates. + scroller.forceFinished(true) + webview.postInvalidateOnAnimation() + + return false + } + + override fun onFling(velocityX: Float, velocityY: Float) { + fling((-velocityX).toInt(), (-velocityY).toInt()) + } + + private fun fling(velocityX: Int, velocityY: Int) { + // Initiates the decay phase of any active edge effects. + // On Android 12 and later, the edge effect (stretch) must + // continue. + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { + releaseEdgeEffects() + } + // Flings use math in pixels, as opposed to math based on the viewport. + val surfaceSize: Point = computeScrollSurfaceSize() + val (startX: Int, startY: Int) = scrollerStartViewport.run { + set(currentViewport) + (surfaceSize.x * (left - AXIS_X_MIN) / (AXIS_X_MAX - AXIS_X_MIN)).toInt() to + (surfaceSize.y * (AXIS_Y_MAX - bottom) / (AXIS_Y_MAX - AXIS_Y_MIN)).toInt() + } + // Before flinging, stops the current animation. + scroller.forceFinished(true) + // Begins the animation. + scroller.fling( + // Current scroll position. + startX, + startY, + velocityX, + velocityY, + */ +/* + * Minimum and maximum scroll positions. The minimum scroll + * position is generally 0 and the maximum scroll position + * is generally the content size less the screen size. So if the + * content width is 1000 pixels and the screen width is 200 + * pixels, the maximum scroll offset is 800 pixels. + *//* + + 0, surfaceSize.x - contentRect.width(), + 0, surfaceSize.y - contentRect.height(), + // The edges of the content. This comes into play when using + // the EdgeEffect class to draw "glow" overlays. + contentRect.width() / 2, + contentRect.height() / 2 + ) + // Invalidates to trigger computeScroll(). + webview.postInvalidateOnAnimation() + + override fun onScroll(distanceX: Float, distanceY: Float) { + TODO("Not yet implemented") + } + +} +*/ diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewServer.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewServer.kt index 33508998e6..7b9f3d2778 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewServer.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewServer.kt @@ -104,6 +104,17 @@ internal class WebViewServer( errorResource() } + link.mediaType + ?.takeIf { it.isHtml } + ?.let { + resource = resource.injectHtml( + publication, + mediaType = it, + baseHref = assetsBaseHref, + disableSelectionWhenProtected = disableSelectionWhenProtected + ) + } + val headers = mutableMapOf( "Accept-Ranges" to "bytes" ) From 103f53b18368fc980eb1bb0b0c28c0530b424fcd Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Thu, 18 Jul 2024 12:21:53 +0200 Subject: [PATCH 06/61] MOSTLY work with nested scroll connection --- gradle/libs.versions.toml | 12 +- .../main/res/xml/network_security_config.xml | 10 + .../readium/navigator/web/NavigatorState.kt | 2 +- .../readium/navigator/web/NavigatorView.kt | 125 ++- .../readium/navigator/web/NavigatorView2.kt | 83 ++ .../web/gestures/AndroidScrollable.android.kt | 19 + .../web/gestures/DragGestureDetector.kt | 382 +++++++++ .../navigator/web/gestures/Draggable.kt | 317 +++++++ .../navigator/web/gestures/Fling2DBehavior.kt | 32 + .../navigator/web/gestures/Scrollable2D.kt | 788 ++++++++++++++++++ .../web/gestures/Scrollable2DState.kt | 169 ++++ .../web/util/LoggingNestedScrollConnection.kt | 20 +- .../web/util/PagerNestedConnection.kt | 79 ++ .../navigator/web/util/WebViewClient.kt | 1 + .../web/util/WebViewDraggableState.kt | 74 ++ .../web/util/WebViewScrollable2DState.kt | 57 ++ .../web/util/WebViewScrollableState.kt | 68 ++ .../web/{util => webview}/ComposeWebView.kt | 19 +- .../web/{util => webview}/LoggingWebView.kt | 27 +- .../navigator/web/webview/RelaxedWebView.kt | 19 + 20 files changed, 2242 insertions(+), 61 deletions(-) create mode 100644 readium/navigators/demo/src/main/res/xml/network_security_config.xml create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView2.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/AndroidScrollable.android.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/DragGestureDetector.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Draggable.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Fling2DBehavior.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2DState.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewDraggableState.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollableState.kt rename readium/navigators/web/src/main/java/org/readium/navigator/web/{util => webview}/ComposeWebView.kt (97%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/{util => webview}/LoggingWebView.kt (79%) create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/webview/RelaxedWebView.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a8e0b4faaf..882607acef 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,12 +12,12 @@ androidx-cardview = "1.0.0" # Make sure to align with the Kotlin version # https://developer.android.com/jetpack/androidx/releases/compose-kotlin androidx-compose-compiler = "1.5.14" -androidx-compose-animation = "1.6.7" -androidx-compose-foundation = "1.6.7" -androidx-compose-material = "1.6.7" -androidx-compose-material3 = "1.2.1" -androidx-compose-runtime = "1.6.7" -androidx-compose-ui = "1.6.7" +androidx-compose-animation = "1.7.0-beta05" +androidx-compose-foundation = "1.7.0-beta05" +androidx-compose-material = "1.7.0-beta05" +androidx-compose-material3 = "1.3.0-beta04" +androidx-compose-runtime = "1.7.0-beta05" +androidx-compose-ui = "1.7.0-beta05" androidx-constraintlayout = "2.1.4" androidx-core = "1.13.1" androidx-datastore = "1.1.1" diff --git a/readium/navigators/demo/src/main/res/xml/network_security_config.xml b/readium/navigators/demo/src/main/res/xml/network_security_config.xml new file mode 100644 index 0000000000..b45ff69724 --- /dev/null +++ b/readium/navigators/demo/src/main/res/xml/network_security_config.xml @@ -0,0 +1,10 @@ + + + + developer.android.com + google.github.io + android-developers.googleblog.com + io.google + + + diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt index 291b469dcc..90bf113257 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt @@ -24,7 +24,7 @@ public class NavigatorState internal constructor( initialPreferences: NavigatorPreferences, defaults: NavigatorDefaults, initialItem: Int, - webViewServer: WebViewServer + internal val webViewServer: WebViewServer ) { public data class ReadingOrder( val items: List diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt index cc44c71502..9ffe2d5eb8 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt @@ -2,15 +2,19 @@ package org.readium.navigator.web import android.annotation.SuppressLint import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior -import androidx.compose.foundation.lazy.LazyRow -import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import org.readium.navigator.web.util.WebView +import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher +import org.readium.navigator.web.util.LoggingNestedScrollConnection +import org.readium.navigator.web.util.PagerNestedConnection import org.readium.navigator.web.util.WebViewServer -import org.readium.navigator.web.util.rememberWebViewState +import org.readium.navigator.web.webview.WebView +import org.readium.navigator.web.webview.rememberWebViewState import org.readium.r2.shared.ExperimentalReadiumApi import timber.log.Timber @@ -22,43 +26,86 @@ public fun NavigatorView( modifier: Modifier, state: NavigatorState ) { - val listState = rememberLazyListState() - val flingBehavior = rememberSnapFlingBehavior(lazyListState = listState) + val pagerState = rememberPagerState { + state.spreads.value.size + } + + HorizontalPager( + modifier = modifier/*.nestedScroll(object : NestedScrollConnection { + + override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { + Timber.d("onPreScroll $available") + return Offset.Zero + } + + override fun onPostScroll( + consumed: Offset, + available: Offset, + source: NestedScrollSource + ): Offset { + Timber.d("onPostScroll $consumed $available") + return Offset(pagerState.dispatchRawDelta(available.x), 0f) + } - LazyRow( - modifier = modifier, + override suspend fun onPreFling(available: Velocity): Velocity { + return Velocity.Zero + } + + override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { + return available + + + })*/, userScrollEnabled = true, - state = listState, - flingBehavior = flingBehavior + state = pagerState, + beyondViewportPageCount = 2, + pageNestedScrollConnection = + LoggingNestedScrollConnection(PagerNestedConnection(pagerState, Orientation.Horizontal)) ) { - items(state.spreads.value) { - when (it) { - is LayoutResolver.Spread.Double -> - throw NotImplementedError() - is LayoutResolver.Spread.Single -> { - val url = WebViewServer.publicationBaseHref.resolve(it.url).toString() - val webViewState = rememberWebViewState(url) - WebView( - modifier = Modifier.fillParentMaxSize(), - state = webViewState, - client = state.webViewClient, - onCreated = { webview -> - Timber.d("WebView onCreate $url") - webview.settings.javaScriptEnabled = true - webview.settings.setSupportZoom(true) - webview.settings.builtInZoomControls = true - webview.settings.displayZoomControls = false - webview.settings.loadWithOverviewMode = true - webview.settings.useWideViewPort = true - webview.isVerticalScrollBarEnabled = false - webview.isHorizontalScrollBarEnabled = false - }, - onDispose = { - Timber.d("WebView onDispose $url") - } - ) - } + when (val it = state.spreads.value[it]) { + is LayoutResolver.Spread.Double -> + throw NotImplementedError() + is LayoutResolver.Spread.Single -> { + val url = WebViewServer.publicationBaseHref.resolve(it.url).toString() + val webViewState = rememberWebViewState(url) + val nestedScrollDispatcher = NestedScrollDispatcher() + WebView( + modifier = Modifier.fillMaxSize(), + /* .nestedScroll(object : NestedScrollConnection { + + override suspend fun onPostFling( + consumed: Velocity, + available: Velocity + ): Velocity { + return available + } + }),*/ + // .nestedScroll(NoOpScrollConnection, nestedScrollDispatcher), + state = webViewState, + client = state.webViewClient, + onCreated = { webview -> + Timber.d("WebView onCreate $url") + webview.settings.javaScriptEnabled = true + webview.settings.setSupportZoom(true) + webview.settings.builtInZoomControls = true + webview.settings.displayZoomControls = false + webview.settings.loadWithOverviewMode = true + webview.settings.useWideViewPort = true + webview.isVerticalScrollBarEnabled = false + webview.isHorizontalScrollBarEnabled = false + }, + onDispose = { + Timber.d("WebView onDispose $url") + } + /*factory = { context -> + LoggingWebView(context).apply { + this.nestedScrollDispatcher = nestedScrollDispatcher + } + }*/ + ) } } } } + +private val NoOpScrollConnection = object : NestedScrollConnection {} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView2.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView2.kt new file mode 100644 index 0000000000..d2ea397022 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView2.kt @@ -0,0 +1,83 @@ +package org.readium.navigator.web + +import android.annotation.SuppressLint +import android.webkit.WebResourceRequest +import android.webkit.WebResourceResponse +import android.webkit.WebView +import android.webkit.WebViewClient +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.viewinterop.AndroidView +import org.readium.navigator.web.util.WebViewServer +import org.readium.navigator.web.webview.rememberWebViewState +import org.readium.r2.shared.ExperimentalReadiumApi +import timber.log.Timber + +@OptIn(ExperimentalFoundationApi::class) +@SuppressLint("SetJavaScriptEnabled") +@ExperimentalReadiumApi +@Composable +public fun NavigatorView2( + modifier: Modifier, + state: NavigatorState +) { + val listState = rememberLazyListState() + val flingBehavior = rememberSnapFlingBehavior(lazyListState = listState) + + LazyRow( + modifier = modifier, + userScrollEnabled = true, + state = listState, + flingBehavior = flingBehavior + ) { + items(state.spreads.value) { + when (it) { + is LayoutResolver.Spread.Double -> + throw NotImplementedError() + is LayoutResolver.Spread.Single -> { + val url = WebViewServer.publicationBaseHref.resolve(it.url).toString() + val webViewState = rememberWebViewState(url) + + AndroidView( + factory = { context -> + android.webkit.WebView(context).apply { + Timber.d("WebView onCreate $url") + settings.javaScriptEnabled = true + settings.setSupportZoom(true) + settings.builtInZoomControls = true + settings.displayZoomControls = false + settings.loadWithOverviewMode = true + settings.useWideViewPort = true + isVerticalScrollBarEnabled = false + isHorizontalScrollBarEnabled = false + webViewClient = object : WebViewClient() { + + override fun shouldInterceptRequest( + view: WebView, + request: WebResourceRequest + ): WebResourceResponse? { + return state.webViewServer.shouldInterceptRequest(request) + } + } + } + }, + modifier = Modifier + .fillMaxSize(), + update = { webView -> webView.loadUrl(url) }, + onReset = { webView -> + webView.stopLoading() + webView.loadUrl("about:blank") + webView.clearHistory() + } + ) + } + } + } + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/AndroidScrollable.android.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/AndroidScrollable.android.kt new file mode 100644 index 0000000000..d96fb200a7 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/AndroidScrollable.android.kt @@ -0,0 +1,19 @@ +package org.readium.navigator.web.gestures + +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.input.pointer.PointerEvent +import androidx.compose.ui.node.CompositionLocalConsumerModifierNode +import androidx.compose.ui.unit.Density +import androidx.compose.ui.unit.IntSize +import androidx.compose.ui.unit.dp +import androidx.compose.ui.util.fastFold + +internal fun CompositionLocalConsumerModifierNode.platformScrollConfig(): ScrollConfig = + AndroidConfig + +private object AndroidConfig : ScrollConfig { + override fun Density.calculateMouseWheelScroll(event: PointerEvent, bounds: IntSize): Offset { + // 64 dp value is taken from ViewConfiguration.java, replace with better solution + return event.changes.fastFold(Offset.Zero) { acc, c -> acc + c.scrollDelta } * -64.dp.toPx() + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/DragGestureDetector.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/DragGestureDetector.kt new file mode 100644 index 0000000000..e1eef2f8d1 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/DragGestureDetector.kt @@ -0,0 +1,382 @@ +/* + * Copyright 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.readium.navigator.web.gestures + +import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.gestures.awaitEachGesture +import androidx.compose.foundation.gestures.awaitFirstDown +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.input.pointer.AwaitPointerEventScope +import androidx.compose.ui.input.pointer.PointerEvent +import androidx.compose.ui.input.pointer.PointerEventPass +import androidx.compose.ui.input.pointer.PointerId +import androidx.compose.ui.input.pointer.PointerInputChange +import androidx.compose.ui.input.pointer.PointerInputScope +import androidx.compose.ui.input.pointer.PointerType +import androidx.compose.ui.input.pointer.changedToUpIgnoreConsumed +import androidx.compose.ui.input.pointer.positionChange +import androidx.compose.ui.input.pointer.positionChangeIgnoreConsumed +import androidx.compose.ui.platform.ViewConfiguration +import androidx.compose.ui.unit.dp +import androidx.compose.ui.util.fastFirstOrNull +import kotlin.math.absoluteValue +import kotlin.math.sign + +/** + * A Gesture detector that waits for pointer down and touch slop in the direction specified by + * [orientationLock] and then calls [onDrag] for each drag event. + * It follows the touch slop detection of [awaitTouchSlopOrCancellation] but will consume the + * position change automatically once the touch slop has been crossed, the amount of drag over + * the touch slop is reported as the first drag event [onDrag] after the slop is crossed. + * If [shouldAwaitTouchSlop] returns true the touch slop recognition phase will be ignored + * and the drag gesture will be recognized immediately.The first [onDrag] in this case will report + * an [Offset.Zero]. + * + * [onDragStart] is called when the touch slop has been passed and includes an [Offset] representing + * the last known pointer position relative to the containing element as well as the initial + * down event that triggered this gesture detection cycle. The [Offset] can be outside + * the actual bounds of the element itself meaning the numbers can be negative or larger than the + * element bounds if the touch target is smaller than the + * [ViewConfiguration.minimumTouchTargetSize]. + * + * [onDragEnd] is called after all pointers are up with the event change of the up event + * and [onDragCancel] is called if another gesture has consumed pointer input, + * canceling this gesture. + * + * @param onDragStart A lambda to be called when the drag gesture starts, it contains information + * about the last known [PointerInputChange] relative to the containing element and the post slop + * delta. + * @param onDragEnd A lambda to be called when the gesture ends. It contains information about the + * up [PointerInputChange] that finished the gesture. + * @param onDragCancel A lambda to be called when the gesture is cancelled either by an error or + * when it was consumed. + * @param shouldAwaitTouchSlop Indicates if touch slop detection should be skipped. + * @param orientationLock Optionally locks detection to this orientation, this means, when this is + * provided, touch slop detection and drag event detection will be conditioned to the given + * orientation axis. [onDrag] will still dispatch events on with information in both axis, but + * if orientation lock is provided, only events that happen on the given orientation will be + * considered. If no value is provided (i.e. null) touch slop and drag detection will happen on + * an "any" orientation basis, that is, touch slop will be detected if crossed in either direction + * and drag events will be dispatched if present in either direction. + * @param onDrag A lambda to be called for each delta event in the gesture. It contains information + * about the [PointerInputChange] and the movement offset. + * + * Example Usage: + * @sample androidx.compose.foundation.samples.DetectDragGesturesSample + * + * @see detectVerticalDragGestures + * @see detectHorizontalDragGestures + * @see detectDragGesturesAfterLongPress to detect gestures after long press + */ +internal suspend fun PointerInputScope.detectDragGestures( + onDragStart: (change: PointerInputChange, initialDelta: Offset) -> Unit, + onDragEnd: (change: PointerInputChange) -> Unit, + onDragCancel: () -> Unit, + shouldAwaitTouchSlop: () -> Boolean, + orientationLock: Orientation?, + onDrag: (change: PointerInputChange, dragAmount: Offset) -> Unit +) { + awaitEachGesture { + val initialDown = + awaitFirstDown(requireUnconsumed = false, pass = PointerEventPass.Initial) + val awaitTouchSlop = shouldAwaitTouchSlop() + + if (!awaitTouchSlop) { + initialDown.consume() + } + val down = awaitFirstDown(requireUnconsumed = false) + var drag: PointerInputChange? + var overSlop = Offset.Zero + var initialDelta = Offset.Zero + + if (awaitTouchSlop) { + do { + drag = awaitPointerSlopOrCancellation( + down.id, + down.type, + orientation = orientationLock + ) { change, over -> + change.consume() + overSlop = over + } + } while (drag != null && !drag.isConsumed) + initialDelta = overSlop + } else { + drag = initialDown + } + + if (drag != null) { + onDragStart.invoke(drag, initialDelta) + onDrag(drag, overSlop) + val upEvent = drag( + pointerId = drag.id, + onDrag = { + onDrag(it, it.positionChange()) + it.consume() + }, + orientation = orientationLock, + motionConsumed = { + it.isConsumed + } + ) + if (upEvent == null) { + onDragCancel() + } else { + onDragEnd(upEvent) + } + } + } +} + +/** + * Continues to read drag events until all pointers are up or the drag event is canceled. + * The initial pointer to use for driving the drag is [pointerId]. [onDrag] is called + * whenever the pointer moves. The up event is returned at the end of the drag gesture. + * + * @param pointerId The pointer where that is driving the gesture. + * @param onDrag Callback for every new drag event. + * @param motionConsumed If the PointerInputChange should be considered as consumed. + * + * @return The last pointer input event change when gesture ended with all pointers up + * and null when the gesture was canceled. + */ +internal suspend inline fun AwaitPointerEventScope.drag( + pointerId: PointerId, + onDrag: (PointerInputChange) -> Unit, + orientation: Orientation?, + motionConsumed: (PointerInputChange) -> Boolean +): PointerInputChange? { + if (currentEvent.isPointerUp(pointerId)) { + return null // The pointer has already been lifted, so the gesture is canceled + } + var pointer = pointerId + while (true) { + val change = awaitDragOrUp(pointer) { + val positionChange = it.positionChangeIgnoreConsumed() + val motionChange = if (orientation == null) { + positionChange.getDistance() + } else { + if (orientation == Orientation.Vertical) positionChange.y else positionChange.x + } + motionChange != 0.0f + } ?: return null + + if (motionConsumed(change)) { + return null + } + + if (change.changedToUpIgnoreConsumed()) { + return change + } + + onDrag(change) + pointer = change.id + } +} + +/** + * Waits for a single drag in one axis, final pointer up, or all pointers are up. + * When [pointerId] has lifted, another pointer that is down is chosen to be the finger + * governing the drag. When the final pointer is lifted, that [PointerInputChange] is + * returned. When a drag is detected, that [PointerInputChange] is returned. A drag is + * only detected when [hasDragged] returns `true`. + * + * `null` is returned if there was an error in the pointer input stream and the pointer + * that was down was dropped before the 'up' was received. + */ +private suspend inline fun AwaitPointerEventScope.awaitDragOrUp( + pointerId: PointerId, + hasDragged: (PointerInputChange) -> Boolean +): PointerInputChange? { + var pointer = pointerId + while (true) { + val event = awaitPointerEvent() + val dragEvent = event.changes.fastFirstOrNull { it.id == pointer } ?: return null + if (dragEvent.changedToUpIgnoreConsumed()) { + val otherDown = event.changes.fastFirstOrNull { it.pressed } + if (otherDown == null) { + // This is the last "up" + return dragEvent + } else { + pointer = otherDown.id + } + } else if (hasDragged(dragEvent)) { + return dragEvent + } + } +} + +/** + * Waits for drag motion and uses [orientation] to detect the direction of touch slop detection. + * It passes [pointerId] as the pointer to examine. If [pointerId] is raised, another pointer from + * those that are down will be chosen to + * lead the gesture, and if none are down, `null` is returned. If [pointerId] is not down when + * [awaitPointerSlopOrCancellation] is called, then `null` is returned. + * + * When pointer slop is detected, [onPointerSlopReached] is called with the change and the distance + * beyond the pointer slop. If [onPointerSlopReached] does not consume the + * position change, pointer slop will not have been considered detected and the detection will + * continue or, if it is consumed, the [PointerInputChange] that was consumed will be returned. + * + * This works with [awaitTouchSlopOrCancellation] for the other axis to ensure that only horizontal + * or vertical dragging is done, but not both. It also works for dragging in two ways when using + * [awaitTouchSlopOrCancellation] + * + * @return The [PointerInputChange] of the event that was consumed in [onPointerSlopReached] or + * `null` if all pointers are raised or the position change was consumed by another gesture + * detector. + */ +private suspend inline fun AwaitPointerEventScope.awaitPointerSlopOrCancellation( + pointerId: PointerId, + pointerType: PointerType, + orientation: Orientation?, + onPointerSlopReached: (PointerInputChange, Offset) -> Unit +): PointerInputChange? { + if (currentEvent.isPointerUp(pointerId)) { + return null // The pointer has already been lifted, so the gesture is canceled + } + val touchSlop = viewConfiguration.pointerSlop(pointerType) + var pointer: PointerId = pointerId + val touchSlopDetector = TouchSlopDetector(orientation) + while (true) { + val event = awaitPointerEvent() + val dragEvent = event.changes.fastFirstOrNull { it.id == pointer } ?: return null + if (dragEvent.isConsumed) { + return null + } else if (dragEvent.changedToUpIgnoreConsumed()) { + val otherDown = event.changes.fastFirstOrNull { it.pressed } + if (otherDown == null) { + // This is the last "up" + return null + } else { + pointer = otherDown.id + } + } else { + val postSlopOffset = touchSlopDetector.addPointerInputChange(dragEvent, touchSlop) + if (postSlopOffset != null) { + onPointerSlopReached( + dragEvent, + postSlopOffset + ) + if (dragEvent.isConsumed) { + return dragEvent + } else { + touchSlopDetector.reset() + } + } else { + // verify that nothing else consumed the drag event + awaitPointerEvent(PointerEventPass.Final) + if (dragEvent.isConsumed) { + return null + } + } + } + } +} + +/** + * Detects if touch slop has been crossed after adding a series of [PointerInputChange]. + * For every new [PointerInputChange] one should add it to this detector using + * [addPointerInputChange]. If the position change causes the touch slop to be crossed, + * [addPointerInputChange] will return true. + */ +private class TouchSlopDetector(val orientation: Orientation? = null) { + + fun Offset.mainAxis() = if (orientation == Orientation.Horizontal) x else y + fun Offset.crossAxis() = if (orientation == Orientation.Horizontal) y else x + + /** + * The accumulation of drag deltas in this detector. + */ + private var totalPositionChange: Offset = Offset.Zero + + /** + * Adds [dragEvent] to this detector. If the accumulated position changes crosses the touch + * slop provided by [touchSlop], this method will return the post slop offset, that is the + * total accumulated delta change minus the touch slop value, otherwise this should return null. + */ + fun addPointerInputChange( + dragEvent: PointerInputChange, + touchSlop: Float + ): Offset? { + val currentPosition = dragEvent.position + val previousPosition = dragEvent.previousPosition + val positionChange = currentPosition - previousPosition + totalPositionChange += positionChange + + val inDirection = if (orientation == null) { + totalPositionChange.getDistance() + } else { + totalPositionChange.mainAxis().absoluteValue + } + + val hasCrossedSlop = inDirection >= touchSlop + + return if (hasCrossedSlop) { + calculatePostSlopOffset(touchSlop) + } else { + null + } + } + + /** + * Resets the accumulator associated with this detector. + */ + fun reset() { + totalPositionChange = Offset.Zero + } + + private fun calculatePostSlopOffset(touchSlop: Float): Offset { + return if (orientation == null) { + val touchSlopOffset = + totalPositionChange / totalPositionChange.getDistance() * touchSlop + // update postSlopOffset + totalPositionChange - touchSlopOffset + } else { + val finalMainAxisChange = totalPositionChange.mainAxis() - + (sign(totalPositionChange.mainAxis()) * touchSlop) + val finalCrossAxisChange = totalPositionChange.crossAxis() + if (orientation == Orientation.Horizontal) { + Offset(finalMainAxisChange, finalCrossAxisChange) + } else { + Offset(finalCrossAxisChange, finalMainAxisChange) + } + } + } +} + +private fun PointerEvent.isPointerUp(pointerId: PointerId): Boolean = + changes.fastFirstOrNull { it.id == pointerId }?.pressed != true + +// This value was determined using experiments and common sense. +// We can't use zero slop, because some hypothetical desktop/mobile devices can send +// pointer events with a very high precision (but I haven't encountered any that send +// events with less than 1px precision) +private val mouseSlop = 0.125.dp +private val defaultTouchSlop = 18.dp // The default touch slop on Android devices +private val mouseToTouchSlopRatio = mouseSlop / defaultTouchSlop + +// TODO(demin): consider this as part of ViewConfiguration class after we make *PointerSlop* +// functions public (see the comment at the top of the file). +// After it will be a public API, we should get rid of `touchSlop / 144` and return absolute +// value 0.125.dp.toPx(). It is not possible right now, because we can't access density. +internal fun ViewConfiguration.pointerSlop(pointerType: PointerType): Float { + return when (pointerType) { + PointerType.Mouse -> touchSlop * mouseToTouchSlopRatio + else -> touchSlop + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Draggable.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Draggable.kt new file mode 100644 index 0000000000..2d45c84e3a --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Draggable.kt @@ -0,0 +1,317 @@ +/* + * Copyright 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.readium.navigator.web.gestures + +import androidx.compose.foundation.MutatePriority +import androidx.compose.foundation.MutatorMutex +import androidx.compose.foundation.gestures.DragScope +import androidx.compose.foundation.gestures.DraggableState +import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.interaction.DragInteraction +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.input.pointer.PointerEvent +import androidx.compose.ui.input.pointer.PointerEventPass +import androidx.compose.ui.input.pointer.PointerInputChange +import androidx.compose.ui.input.pointer.SuspendingPointerInputModifierNode +import androidx.compose.ui.input.pointer.util.VelocityTracker +import androidx.compose.ui.input.pointer.util.addPointerInputChange +import androidx.compose.ui.node.CompositionLocalConsumerModifierNode +import androidx.compose.ui.node.DelegatingNode +import androidx.compose.ui.node.PointerInputModifierNode +import androidx.compose.ui.node.currentValueOf +import androidx.compose.ui.platform.LocalViewConfiguration +import androidx.compose.ui.unit.IntSize +import androidx.compose.ui.unit.Velocity +import kotlin.coroutines.cancellation.CancellationException +import kotlin.math.sign +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch +import org.readium.navigator.web.gestures.DragEvent.DragCancelled +import org.readium.navigator.web.gestures.DragEvent.DragDelta +import org.readium.navigator.web.gestures.DragEvent.DragStarted +import org.readium.navigator.web.gestures.DragEvent.DragStopped + +/** + * A node that performs drag gesture recognition and event propagation. + */ +internal abstract class DragGestureNode( + canDrag: (PointerInputChange) -> Boolean, + enabled: Boolean, + interactionSource: MutableInteractionSource?, + private var orientationLock: Orientation? +) : DelegatingNode(), PointerInputModifierNode, CompositionLocalConsumerModifierNode { + + protected var canDrag = canDrag + private set + protected var enabled = enabled + private set + protected var interactionSource = interactionSource + private set + + // Use wrapper lambdas here to make sure that if these properties are updated while we suspend, + // we point to the new reference when we invoke them. startDragImmediately is a lambda since we + // need the most recent value passed to it from Scrollable. + private val _canDrag: (PointerInputChange) -> Boolean = { this.canDrag(it) } + private var channel: Channel? = null + private var dragInteraction: DragInteraction.Start? = null + private var isListeningForEvents = false + + /** + * Responsible for the dragging behavior between the start and the end of the drag. It + * continually invokes `forEachDelta` to process incoming events. In return, `forEachDelta` + * calls `dragBy` method to process each individual delta. + */ + abstract suspend fun drag(forEachDelta: suspend ((dragDelta: DragDelta) -> Unit) -> Unit) + + /** + * Passes the action needed when a drag starts. This gives the ability to pass the desired + * behavior from other nodes implementing AbstractDraggableNode + */ + abstract fun onDragStarted(startedPosition: Offset) + + /** + * Passes the action needed when a drag stops. This gives the ability to pass the desired + * behavior from other nodes implementing AbstractDraggableNode + */ + abstract fun onDragStopped(velocity: Velocity) + + /** + * If touch slop recognition should be skipped. If this is true, this node will start + * recognizing drag events immediately without waiting for touch slop. + */ + abstract fun startDragImmediately(): Boolean + + private fun startListeningForEvents() { + isListeningForEvents = true + + /** + * To preserve the original behavior we had (before the Modifier.Node migration) we need to + * scope the DragStopped and DragCancel methods to the node's coroutine scope instead of using + * the one provided by the pointer input modifier, this is to ensure that even when the pointer + * input scope is reset we will continue any coroutine scope scope that we started from these + * methods while the pointer input scope was active. + */ + coroutineScope.launch { + while (isActive) { + var event = channel?.receive() + if (event !is DragStarted) continue + processDragStart(event) + try { + drag { processDelta -> + while (event !is DragStopped && event !is DragCancelled) { + (event as? DragDelta)?.let(processDelta) + event = channel?.receive() + } + } + if (event is DragStopped) { + processDragStop(event as DragStopped) + } else if (event is DragCancelled) { + processDragCancel() + } + } catch (c: CancellationException) { + processDragCancel() + } + } + } + } + + private var pointerInputNode: SuspendingPointerInputModifierNode? = null + + override fun onDetach() { + isListeningForEvents = false + disposeInteractionSource() + } + + override fun onPointerEvent( + pointerEvent: PointerEvent, + pass: PointerEventPass, + bounds: IntSize + ) { + if (enabled && pointerInputNode == null) { + pointerInputNode = delegate(initializePointerInputNode()) + } + pointerInputNode?.onPointerEvent(pointerEvent, pass, bounds) + } + + private fun initializePointerInputNode(): SuspendingPointerInputModifierNode { + return SuspendingPointerInputModifierNode { + // re-create tracker when pointer input block restarts. This lazily creates the tracker + // only when it is need. + val velocityTracker = VelocityTracker() + val onDragStart: (change: PointerInputChange, initialDelta: Offset) -> Unit = + { startEvent, initialDelta -> + if (canDrag.invoke(startEvent)) { + if (!isListeningForEvents) { + if (channel == null) { + channel = Channel(capacity = Channel.UNLIMITED) + } + startListeningForEvents() + } + val overSlopOffset = initialDelta + val xSign = sign(startEvent.position.x) + val ySign = sign(startEvent.position.y) + val adjustedStart = startEvent.position - + Offset(overSlopOffset.x * xSign, overSlopOffset.y * ySign) + + channel?.trySend(DragStarted(adjustedStart)) + } + } + + val onDragEnd: (change: PointerInputChange) -> Unit = { upEvent -> + velocityTracker.addPointerInputChange(upEvent) + val maximumVelocity = currentValueOf(LocalViewConfiguration) + .maximumFlingVelocity + val velocity = velocityTracker.calculateVelocity( + Velocity(maximumVelocity, maximumVelocity) + ) + velocityTracker.resetTracking() + channel?.trySend(DragStopped(velocity)) + } + + val onDragCancel: () -> Unit = { + channel?.trySend(DragCancelled) + } + + val shouldAwaitTouchSlop: () -> Boolean = { + !startDragImmediately() + } + + val onDrag: (change: PointerInputChange, dragAmount: Offset) -> Unit = + { change, delta -> + velocityTracker.addPointerInputChange(change) + channel?.trySend(DragDelta(delta)) + } + + coroutineScope { + try { + detectDragGestures( + orientationLock = orientationLock, + onDragStart = onDragStart, + onDragEnd = onDragEnd, + onDragCancel = onDragCancel, + shouldAwaitTouchSlop = shouldAwaitTouchSlop, + onDrag = onDrag + ) + } catch (cancellation: CancellationException) { + channel?.trySend(DragCancelled) + if (!isActive) throw cancellation + } + } + } + } + + override fun onCancelPointerInput() { + pointerInputNode?.onCancelPointerInput() + } + + private suspend fun processDragStart(event: DragStarted) { + dragInteraction?.let { oldInteraction -> + interactionSource?.emit(DragInteraction.Cancel(oldInteraction)) + } + val interaction = DragInteraction.Start() + interactionSource?.emit(interaction) + dragInteraction = interaction + onDragStarted(event.startPoint) + } + + private suspend fun processDragStop(event: DragStopped) { + dragInteraction?.let { interaction -> + interactionSource?.emit(DragInteraction.Stop(interaction)) + dragInteraction = null + } + onDragStopped(event.velocity) + } + + private suspend fun processDragCancel() { + dragInteraction?.let { interaction -> + interactionSource?.emit(DragInteraction.Cancel(interaction)) + dragInteraction = null + } + onDragStopped(Velocity.Zero) + } + + fun disposeInteractionSource() { + dragInteraction?.let { interaction -> + interactionSource?.tryEmit(DragInteraction.Cancel(interaction)) + dragInteraction = null + } + } + + fun update( + canDrag: (PointerInputChange) -> Boolean = this.canDrag, + enabled: Boolean = this.enabled, + interactionSource: MutableInteractionSource? = this.interactionSource, + orientationLock: Orientation? = this.orientationLock, + shouldResetPointerInputHandling: Boolean = false + ) { + var resetPointerInputHandling = shouldResetPointerInputHandling + + this.canDrag = canDrag + if (this.enabled != enabled) { + this.enabled = enabled + if (!enabled) { + disposeInteractionSource() + pointerInputNode?.let { undelegate(it) } + pointerInputNode = null + } + resetPointerInputHandling = true + } + if (this.interactionSource != interactionSource) { + disposeInteractionSource() + this.interactionSource = interactionSource + } + + if (this.orientationLock != orientationLock) { + this.orientationLock = orientationLock + resetPointerInputHandling = true + } + + if (resetPointerInputHandling) { + pointerInputNode?.resetPointerInputHandler() + } + } +} + +private class DefaultDraggableState(val onDelta: (Float) -> Unit) : DraggableState { + + private val dragScope: DragScope = object : DragScope { + override fun dragBy(pixels: Float): Unit = onDelta(pixels) + } + + private val scrollMutex = MutatorMutex() + + override suspend fun drag( + dragPriority: MutatePriority, + block: suspend DragScope.() -> Unit + ): Unit = coroutineScope { + scrollMutex.mutateWith(dragScope, dragPriority, block) + } + + override fun dispatchRawDelta(delta: Float) { + return onDelta(delta) + } +} + +internal sealed class DragEvent { + class DragStarted(val startPoint: Offset) : DragEvent() + class DragStopped(val velocity: Velocity) : DragEvent() + object DragCancelled : DragEvent() + class DragDelta(val delta: Offset) : DragEvent() +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Fling2DBehavior.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Fling2DBehavior.kt new file mode 100644 index 0000000000..af95d26eb1 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Fling2DBehavior.kt @@ -0,0 +1,32 @@ +package org.readium.navigator.web.gestures + +import androidx.compose.foundation.gestures.ScrollScope +import androidx.compose.foundation.gestures.scrollable +import androidx.compose.runtime.Stable +import androidx.compose.ui.unit.Velocity + +/** + * Interface to specify fling behavior. + * + * When drag has ended with velocity in [scrollable], [performFling] is invoked to perform fling + * animation and update state via [ScrollScope.scrollBy] + */ +@Stable +internal interface Fling2DBehavior { + /** + * Perform settling via fling animation with given velocity and suspend until fling has + * finished. + * + * This functions is called with [ScrollScope] to drive the state change of the + * [androidx.compose.foundation.gestures.ScrollableState] via [ScrollScope.scrollBy]. + * + * This function must return correct velocity left after it is finished flinging in order to + * guarantee proper nested scroll support. + * + * @param initialVelocity velocity available for fling in the orientation specified in + * [androidx.compose.foundation.gestures.scrollable] that invoked this method. + * + * @return remaining velocity after fling operation has ended + */ + suspend fun Scroll2DScope.performFling(initialVelocity: Velocity): Velocity +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt new file mode 100644 index 0000000000..f981b9e2a1 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt @@ -0,0 +1,788 @@ +package org.readium.navigator.web.gestures + +import androidx.compose.animation.core.AnimationVector2D +import androidx.compose.animation.core.DecayAnimationSpec +import androidx.compose.animation.core.TwoWayConverter +import androidx.compose.animation.core.VectorConverter +import androidx.compose.animation.core.animate +import androidx.compose.animation.rememberSplineBasedDecay +import androidx.compose.animation.splineBasedDecay +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.MutatePriority +import androidx.compose.foundation.OverscrollEffect +import androidx.compose.foundation.gestures.FlingBehavior +import androidx.compose.foundation.gestures.LocalBringIntoViewSpec +import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.gestures.ScrollableState +import androidx.compose.foundation.gestures.draggable +import androidx.compose.foundation.gestures.scrollable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.MotionDurationScale +import androidx.compose.ui.focus.FocusProperties +import androidx.compose.ui.focus.FocusPropertiesModifierNode +import androidx.compose.ui.focus.FocusTargetModifierNode +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher +import androidx.compose.ui.input.nestedscroll.NestedScrollSource +import androidx.compose.ui.input.nestedscroll.nestedScrollModifierNode +import androidx.compose.ui.input.pointer.PointerEvent +import androidx.compose.ui.input.pointer.PointerEventPass +import androidx.compose.ui.input.pointer.PointerEventType +import androidx.compose.ui.input.pointer.PointerInputChange +import androidx.compose.ui.input.pointer.PointerType +import androidx.compose.ui.node.CompositionLocalConsumerModifierNode +import androidx.compose.ui.node.ModifierNodeElement +import androidx.compose.ui.node.ObserverModifierNode +import androidx.compose.ui.node.SemanticsModifierNode +import androidx.compose.ui.node.TraversableNode +import androidx.compose.ui.node.currentValueOf +import androidx.compose.ui.node.invalidateSemantics +import androidx.compose.ui.node.observeReads +import androidx.compose.ui.node.requireDensity +import androidx.compose.ui.platform.InspectorInfo +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.semantics.SemanticsPropertyReceiver +import androidx.compose.ui.semantics.scrollBy +import androidx.compose.ui.semantics.scrollByOffset +import androidx.compose.ui.unit.Density +import androidx.compose.ui.unit.IntSize +import androidx.compose.ui.unit.LayoutDirection +import androidx.compose.ui.unit.Velocity +import androidx.compose.ui.util.fastAll +import androidx.compose.ui.util.fastForEach +import kotlinx.coroutines.launch +import timber.log.Timber + +/** + * Configure touch scrolling and flinging for the UI element in a single [Orientation]. + * + * Users should update their state themselves using default [ScrollableState] and its + * `consumeScrollDelta` callback or by implementing [ScrollableState] interface manually and reflect + * their own state in UI when using this component. + * + * If you don't need to have fling or nested scroll support, but want to make component simply + * draggable, consider using [draggable]. + * + * @sample androidx.compose.foundation.samples.ScrollableSample + * + * @param state [ScrollableState] state of the scrollable. Defines how scroll events will be + * interpreted by the user land logic and contains useful information about on-going events. + * @param orientation orientation of the scrolling + * @param enabled whether or not scrolling in enabled + * @param reverseDirection reverse the direction of the scroll, so top to bottom scroll will + * behave like bottom to top and left to right will behave like right to left. + * @param flingBehavior logic describing fling behavior when drag has finished with velocity. If + * `null`, default from [ScrollableDefaults.flingBehavior] will be used. + * @param interactionSource [MutableInteractionSource] that will be used to emit + * drag events when this scrollable is being dragged. + */ +@Stable +@OptIn(ExperimentalFoundationApi::class) +internal fun Modifier.scrollable2D( + state: Scrollable2DState, + enabled: Boolean = true, + reverseDirection: Boolean = false, + flingBehavior: Fling2DBehavior? = null, + interactionSource: MutableInteractionSource? = null +): Modifier = scrollable2D( + state = state, + enabled = enabled, + reverseDirection = reverseDirection, + flingBehavior = flingBehavior, + interactionSource = interactionSource, + overscrollEffect = null +) + +/** + * Configure touch scrolling and flinging for the UI element in a single [Orientation]. + * + * Users should update their state themselves using default [ScrollableState] and its + * `consumeScrollDelta` callback or by implementing [ScrollableState] interface manually and reflect + * their own state in UI when using this component. + * + * If you don't need to have fling or nested scroll support, but want to make component simply + * draggable, consider using [draggable]. + * + * This overload provides the access to [OverscrollEffect] that defines the behaviour of the + * over scrolling logic. Consider using [ScrollableDefaults.overscrollEffect] for the platform + * look-and-feel. + * + * @sample androidx.compose.foundation.samples.ScrollableSample + * + * @param state [ScrollableState] state of the scrollable. Defines how scroll events will be + * interpreted by the user land logic and contains useful information about on-going events. + * @param orientation orientation of the scrolling + * @param overscrollEffect effect to which the deltas will be fed when the scrollable have + * some scrolling delta left. Pass `null` for no overscroll. If you pass an effect you should + * also apply [androidx.compose.foundation.overscroll] modifier. + * @param enabled whether or not scrolling in enabled + * @param reverseDirection reverse the direction of the scroll, so top to bottom scroll will + * behave like bottom to top and left to right will behave like right to left. + * @param flingBehavior logic describing fling behavior when drag has finished with velocity. If + * `null`, default from [ScrollableDefaults.flingBehavior] will be used. + * @param interactionSource [MutableInteractionSource] that will be used to emit + * drag events when this scrollable is being dragged. + * @param bringIntoViewSpec The configuration that this scrollable should use to perform + * scrolling when scroll requests are received from the focus system. If null is provided the + * system will use the behavior provided by [LocalBringIntoViewSpec] which by default has a + * platform dependent implementation. + * + * Note: This API is experimental as it brings support for some experimental features: + * [overscrollEffect] and [bringIntoViewSpec]. + */ +@Stable +@ExperimentalFoundationApi +internal fun Modifier.scrollable2D( + state: Scrollable2DState, + overscrollEffect: OverscrollEffect?, + enabled: Boolean = true, + reverseDirection: Boolean = false, + flingBehavior: Fling2DBehavior? = null, + interactionSource: MutableInteractionSource? = null +) = this then Scrollable2DElement( + state, + overscrollEffect, + enabled, + reverseDirection, + flingBehavior, + interactionSource +) + +@OptIn(ExperimentalFoundationApi::class) +private class Scrollable2DElement( + val state: Scrollable2DState, + val overscrollEffect: OverscrollEffect?, + val enabled: Boolean, + val reverseDirection: Boolean, + val flingBehavior: Fling2DBehavior?, + val interactionSource: MutableInteractionSource? +) : ModifierNodeElement() { + override fun create(): Scrollable2DNode { + return Scrollable2DNode( + state, + overscrollEffect, + flingBehavior, + enabled, + reverseDirection, + interactionSource + ) + } + + override fun update(node: Scrollable2DNode) { + node.update( + state, + overscrollEffect, + enabled, + reverseDirection, + flingBehavior, + interactionSource + ) + } + + override fun hashCode(): Int { + var result = state.hashCode() + result = 31 * result + overscrollEffect.hashCode() + result = 31 * result + enabled.hashCode() + result = 31 * result + reverseDirection.hashCode() + result = 31 * result + flingBehavior.hashCode() + result = 31 * result + interactionSource.hashCode() + return result + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + + if (other !is Scrollable2DElement) return false + + if (state != other.state) return false + if (overscrollEffect != other.overscrollEffect) return false + if (enabled != other.enabled) return false + if (reverseDirection != other.reverseDirection) return false + if (flingBehavior != other.flingBehavior) return false + if (interactionSource != other.interactionSource) return false + + return true + } + + override fun InspectorInfo.inspectableProperties() { + name = "scrollable" + properties["state"] = state + properties["overscrollEffect"] = overscrollEffect + properties["enabled"] = enabled + properties["reverseDirection"] = reverseDirection + properties["flingBehavior"] = flingBehavior + properties["interactionSource"] = interactionSource + } +} + +@OptIn(ExperimentalFoundationApi::class) +private class Scrollable2DNode( + state: Scrollable2DState, + private var overscrollEffect: OverscrollEffect?, + private var flingBehavior: Fling2DBehavior?, + enabled: Boolean, + reverseDirection: Boolean, + interactionSource: MutableInteractionSource? +) : DragGestureNode( + canDrag = CanDragCalculation, + enabled = enabled, + interactionSource = interactionSource, + orientationLock = null +), + ObserverModifierNode, + CompositionLocalConsumerModifierNode, + FocusPropertiesModifierNode, + SemanticsModifierNode { + + override val shouldAutoInvalidate: Boolean = false + + private val nestedScrollDispatcher = NestedScrollDispatcher() + + private val scrollableContainerNode = + delegate(ScrollableContainerNode(enabled)) + + // Place holder fling behavior, we'll initialize it when the density is available. + private val defaultFlingBehavior = DefaultFling2DBehavior(splineBasedDecay(UnityDensity)) + + private val scrollingLogic = ScrollingLogic( + scrollableState = state, + overscrollEffect = overscrollEffect, + reverseDirection = reverseDirection, + flingBehavior = flingBehavior ?: defaultFlingBehavior, + nestedScrollDispatcher = nestedScrollDispatcher + ) + + private val nestedScrollConnection = + ScrollableNestedScrollConnection(enabled = enabled, scrollingLogic = scrollingLogic) + + // Need to wait until onAttach to read the scroll config. Currently this is static, so we + // don't need to worry about observation / updating this over time. + private var scrollConfig: ScrollConfig? = null + private var scrollByAction: ((x: Float, y: Float) -> Boolean)? = null + private var scrollByOffsetAction: (suspend (Offset) -> Offset)? = null + + init { + /** + * Nested scrolling + */ + delegate(nestedScrollModifierNode(nestedScrollConnection, nestedScrollDispatcher)) + + /** + * Focus scrolling + */ + delegate(FocusTargetModifierNode()) + } + + override suspend fun drag( + forEachDelta: suspend ((dragDelta: DragEvent.DragDelta) -> Unit) -> Unit + ) { + with(scrollingLogic) { + scroll(scrollPriority = MutatePriority.UserInput) { + forEachDelta { + scrollByWithOverscroll( + it.delta, + source = NestedScrollSource.UserInput + ) + } + } + } + } + + override fun onDragStarted(startedPosition: Offset) {} + + override fun onDragStopped(velocity: Velocity) { + nestedScrollDispatcher.coroutineScope.launch { + scrollingLogic.onDragStopped(velocity) + } + } + + override fun startDragImmediately(): Boolean { + return scrollingLogic.shouldScrollImmediately() + } + + fun update( + state: Scrollable2DState, + overscrollEffect: OverscrollEffect?, + enabled: Boolean, + reverseDirection: Boolean, + flingBehavior: Fling2DBehavior?, + interactionSource: MutableInteractionSource? + ) { + var shouldInvalidateSemantics = false + if (this.enabled != enabled) { // enabled changed + nestedScrollConnection.enabled = enabled + scrollableContainerNode.update(enabled) + shouldInvalidateSemantics = true + } + // a new fling behavior was set, change the resolved one. + val resolvedFlingBehavior = flingBehavior ?: defaultFlingBehavior + + val resetPointerInputHandling = scrollingLogic.update( + scrollableState = state, + overscrollEffect = overscrollEffect, + reverseDirection = reverseDirection, + flingBehavior = resolvedFlingBehavior, + nestedScrollDispatcher = nestedScrollDispatcher + ) + + this.overscrollEffect = overscrollEffect + this.flingBehavior = flingBehavior + + // update DragGestureNode + update( + canDrag = CanDragCalculation, + enabled = enabled, + interactionSource = interactionSource, + orientationLock = null, + shouldResetPointerInputHandling = resetPointerInputHandling + ) + + if (shouldInvalidateSemantics) { + clearScrollSemanticsActions() + invalidateSemantics() + } + } + + override fun onAttach() { + updateDefaultFlingBehavior() + scrollConfig = platformScrollConfig() + } + + override fun onObservedReadsChanged() { + // if density changes, update the default fling behavior. + updateDefaultFlingBehavior() + } + + private fun updateDefaultFlingBehavior() { + // monitor change in Density + observeReads { + val density = currentValueOf(LocalDensity) + defaultFlingBehavior.flingDecay = splineBasedDecay(density) + } + } + + override fun applyFocusProperties(focusProperties: FocusProperties) { + focusProperties.canFocus = false + } + + override fun onPointerEvent( + pointerEvent: PointerEvent, + pass: PointerEventPass, + bounds: IntSize + ) { + super.onPointerEvent(pointerEvent, pass, bounds) + if (pass == PointerEventPass.Main && pointerEvent.type == PointerEventType.Scroll) { + processMouseWheelEvent(pointerEvent, bounds) + } + } + + override fun SemanticsPropertyReceiver.applySemantics() { + if (enabled && (scrollByAction == null || scrollByOffsetAction == null)) { + setScrollSemanticsActions() + } + + scrollByAction?.let { + scrollBy(action = it) + } + + scrollByOffsetAction?.let { + scrollByOffset(action = it) + } + } + + private fun setScrollSemanticsActions() { + scrollByAction = { x, y -> + coroutineScope.launch { + scrollingLogic.semanticsScrollBy(Offset(x, y)) + } + true + } + + scrollByOffsetAction = { offset -> scrollingLogic.semanticsScrollBy(offset) } + } + + private fun clearScrollSemanticsActions() { + scrollByAction = null + scrollByOffsetAction = null + } + + /** + * Mouse wheel + */ + private fun processMouseWheelEvent(event: PointerEvent, size: IntSize) { + if (event.changes.fastAll { !it.isConsumed }) { + with(scrollConfig!!) { + val scrollAmount = requireDensity().calculateMouseWheelScroll(event, size) + // A coroutine is launched for every individual scroll event in the + // larger scroll gesture. If we see degradation in the future (that is, + // a fast scroll gesture on a slow device causes UI jank [not seen up to + // this point), we can switch to a more efficient solution where we + // lazily launch one coroutine (with the first event) and use a Channel + // to communicate the scroll amount to the UI thread. + coroutineScope.launch { + scrollingLogic.scroll(scrollPriority = MutatePriority.UserInput) { + scrollBy( + offset = scrollAmount, + source = NestedScrollSource.UserInput + ) + } + } + event.changes.fastForEach { it.consume() } + } + } + } +} + +/** + * Contains the default values used by [scrollable] + */ +internal object Scrollable2DDefaults { + + /** + * Create and remember default [FlingBehavior] that will represent natural fling curve. + */ + @Composable + fun flingBehavior(): Fling2DBehavior { + val flingSpec = rememberSplineBasedDecay() + return remember(flingSpec) { + DefaultFling2DBehavior(flingSpec) + } + } + + /** + * Used to determine the value of `reverseDirection` parameter of [Modifier.scrollable] + * in scrollable layouts. + * + * @param layoutDirection current layout direction (e.g. from [LocalLayoutDirection]) + * @param orientation orientation of scroll + * @param reverseScrolling whether scrolling direction should be reversed + * + * @return `true` if scroll direction should be reversed, `false` otherwise. + */ + fun reverseDirection( + layoutDirection: LayoutDirection, + orientation: Orientation, + reverseScrolling: Boolean + ): Boolean { + // A finger moves with the content, not with the viewport. Therefore, + // always reverse once to have "natural" gesture that goes reversed to layout + var reverseDirection = !reverseScrolling + // But if rtl and horizontal, things move the other way around + val isRtl = layoutDirection == LayoutDirection.Rtl + if (isRtl && orientation != Orientation.Vertical) { + reverseDirection = !reverseDirection + } + return reverseDirection + } +} + +internal interface ScrollConfig { + fun Density.calculateMouseWheelScroll(event: PointerEvent, bounds: IntSize): Offset +} + +private val CanDragCalculation: (PointerInputChange) -> Boolean = + { change -> change.type != PointerType.Mouse } + +/** + * Holds all scrolling related logic: controls nested scrolling, flinging, overscroll and delta + * dispatching. + */ +@OptIn(ExperimentalFoundationApi::class) +internal class ScrollingLogic( + private var scrollableState: Scrollable2DState, + private var overscrollEffect: OverscrollEffect?, + private var flingBehavior: Fling2DBehavior, + private var reverseDirection: Boolean, + private var nestedScrollDispatcher: NestedScrollDispatcher +) { + fun Offset.reverseIfNeeded(): Offset = if (reverseDirection) this * -1f else this + + fun Velocity.reverseIfNeeded(): Velocity = if (reverseDirection) this * -1f else this + + private var latestScrollSource = NestedScrollSource.UserInput + private var outerStateScope = NoOpScrollScope + + private val nestedScrollScope = object : NestedScrollScope { + override fun scrollBy(offset: Offset, source: NestedScrollSource): Offset { + return with(outerStateScope) { + performScroll(offset, source) + } + } + + override fun scrollByWithOverscroll(offset: Offset, source: NestedScrollSource): Offset { + latestScrollSource = source + val overscroll = overscrollEffect + return if (overscroll != null && shouldDispatchOverscroll) { + overscroll.applyToScroll(offset, latestScrollSource, performScrollForOverscroll) + } else { + with(outerStateScope) { + performScroll(offset, source) + } + } + } + } + + private val performScrollForOverscroll: (Offset) -> Offset = { delta -> + with(outerStateScope) { + performScroll(delta, latestScrollSource) + } + } + + private fun Scroll2DScope.performScroll(delta: Offset, source: NestedScrollSource): Offset { + val consumedByPreScroll = + nestedScrollDispatcher.dispatchPreScroll(delta, source) + Timber.d("ConsumedByPreScroll $consumedByPreScroll") + + val scrollAvailableAfterPreScroll = delta - consumedByPreScroll + + val deltaForSelfScroll = + scrollAvailableAfterPreScroll.reverseIfNeeded() + + // Consume on a single axis. + val consumedBySelfScroll = + scrollBy(deltaForSelfScroll).reverseIfNeeded() + Timber.d("ConsumedBySelfScroll $consumedBySelfScroll") + + val deltaAvailableAfterScroll = scrollAvailableAfterPreScroll - consumedBySelfScroll + val consumedByPostScroll = nestedScrollDispatcher.dispatchPostScroll( + consumedBySelfScroll, + deltaAvailableAfterScroll, + source + ) + Timber.d("ConsumedByPostScroll $consumedByPostScroll") + return consumedByPreScroll + consumedBySelfScroll + consumedByPostScroll + } + + private val shouldDispatchOverscroll + get() = scrollableState.canScrollTop || scrollableState.canScrollBottom || + scrollableState.canScrollRight || scrollableState.canScrollLeft + + fun performRawScroll(scroll: Offset): Offset { + return if (scrollableState.isScrollInProgress) { + Offset.Zero + } else { + scrollableState.dispatchRawDelta(scroll.reverseIfNeeded()) + .reverseIfNeeded() + } + } + + suspend fun onDragStopped(availableVelocity: Velocity) { + val performFling: suspend (Velocity) -> Velocity = { velocity -> + val preConsumedByParent = nestedScrollDispatcher + .dispatchPreFling(velocity) + val available = velocity - preConsumedByParent + + val velocityLeft = doFlingAnimation(available) + + val consumedPost = + nestedScrollDispatcher.dispatchPostFling( + (available - velocityLeft), + velocityLeft + ) + val totalLeft = velocityLeft - consumedPost + velocity - totalLeft + } + + val overscroll = overscrollEffect + if (overscroll != null && shouldDispatchOverscroll) { + overscroll.applyToFling(availableVelocity, performFling) + } else { + performFling(availableVelocity) + } + } + + suspend fun doFlingAnimation(available: Velocity): Velocity { + var result: Velocity = available + scroll(scrollPriority = MutatePriority.Default) { + val nestedScrollScope = this + val reverseScope = object : Scroll2DScope { + override fun scrollBy(pixels: Offset): Offset { + return nestedScrollScope.scrollByWithOverscroll( + offset = pixels.reverseIfNeeded(), + source = NestedScrollSource.SideEffect + ).reverseIfNeeded() + } + } + + with(reverseScope) { + with(flingBehavior) { + result = performFling(available.reverseIfNeeded()).reverseIfNeeded() + } + } + } + return result + } + + fun shouldScrollImmediately(): Boolean { + return scrollableState.isScrollInProgress || + overscrollEffect?.isInProgress ?: false + } + + /** + * Opens a scrolling session with nested scrolling and overscroll support. + */ + suspend fun scroll( + scrollPriority: MutatePriority = MutatePriority.Default, + block: suspend NestedScrollScope.() -> Unit + ) { + scrollableState.scroll(scrollPriority) { + outerStateScope = this + block.invoke(nestedScrollScope) + } + } + + /** + * @return true if the pointer input should be reset + */ + fun update( + scrollableState: Scrollable2DState, + overscrollEffect: OverscrollEffect?, + reverseDirection: Boolean, + flingBehavior: Fling2DBehavior, + nestedScrollDispatcher: NestedScrollDispatcher + ): Boolean { + var resetPointerInputHandling = false + if (this.scrollableState != scrollableState) { + this.scrollableState = scrollableState + resetPointerInputHandling = true + } + this.overscrollEffect = overscrollEffect + if (this.reverseDirection != reverseDirection) { + this.reverseDirection = reverseDirection + resetPointerInputHandling = true + } + this.flingBehavior = flingBehavior + this.nestedScrollDispatcher = nestedScrollDispatcher + return resetPointerInputHandling + } +} + +private val NoOpScrollScope: Scroll2DScope = object : Scroll2DScope { + override fun scrollBy(pixels: Offset): Offset = pixels +} + +private class ScrollableNestedScrollConnection( + val scrollingLogic: ScrollingLogic, + var enabled: Boolean +) : NestedScrollConnection { + + override fun onPostScroll( + consumed: Offset, + available: Offset, + source: NestedScrollSource + ): Offset = if (enabled) { + scrollingLogic.performRawScroll(available) + } else { + Offset.Zero + } + + override suspend fun onPostFling( + consumed: Velocity, + available: Velocity + ): Velocity { + return if (enabled) { + val velocityLeft = scrollingLogic.doFlingAnimation(available) + available - velocityLeft + } else { + Velocity.Zero + } + } +} + +internal class DefaultFling2DBehavior( + var flingDecay: DecayAnimationSpec, + private val motionDurationScale: MotionDurationScale = DefaultScrollMotionDurationScale +) : Fling2DBehavior { + + override suspend fun Scroll2DScope.performFling(initialVelocity: Velocity): Velocity { + return Velocity.Zero + } +} + +private const val DefaultScrollMotionDurationScaleFactor = 1f +internal val DefaultScrollMotionDurationScale = object : MotionDurationScale { + override val scaleFactor: Float + get() = DefaultScrollMotionDurationScaleFactor +} + +/** + * (b/311181532): This could not be flattened so we moved it to TraversableNode, but ideally + * ScrollabeNode should be the one to be travesable. + */ +internal class ScrollableContainerNode(enabled: Boolean) : + Modifier.Node(), + TraversableNode { + override val traverseKey: Any = TraverseKey + + var enabled: Boolean = enabled + private set + + companion object TraverseKey + + fun update(enabled: Boolean) { + this.enabled = enabled + } +} + +private val UnityDensity = object : Density { + override val density: Float + get() = 1f + override val fontScale: Float + get() = 1f +} + +/** + * A scroll scope for nested scrolling and overscroll support. + */ +internal interface NestedScrollScope { + fun scrollBy( + offset: Offset, + source: NestedScrollSource + ): Offset + + fun scrollByWithOverscroll( + offset: Offset, + source: NestedScrollSource + ): Offset +} + +/** + * Scroll deltas originating from the semantics system. Should be dispatched as an animation + * driven event. + */ +private suspend fun ScrollingLogic.semanticsScrollBy(offset: Offset): Offset { + var previousValue = Offset.Zero + scroll(scrollPriority = MutatePriority.Default) { + animate(Offset.VectorConverter, Offset.Zero, offset) { currentValue, _ -> + val delta = currentValue - previousValue + val consumed = + scrollBy( + offset = delta.reverseIfNeeded(), + source = NestedScrollSource.UserInput + ).reverseIfNeeded() + previousValue += consumed + } + } + return previousValue +} + +/** + * A type converter that converts a [Velocity] to a [AnimationVector2D], and vice versa. + */ +internal val Velocity.Companion.VectorConverter: TwoWayConverter + get() = VelocityToVector + +/** + * A type converter that converts a [Velocity] to a [AnimationVector2D], and vice versa. + */ +private val VelocityToVector: TwoWayConverter = + TwoWayConverter( + convertToVector = { AnimationVector2D(it.x, it.y) }, + convertFromVector = { Velocity(it.v1, it.v2) } + ) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2DState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2DState.kt new file mode 100644 index 0000000000..4ab82fbd73 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2DState.kt @@ -0,0 +1,169 @@ +package org.readium.navigator.web.gestures + +import androidx.compose.foundation.MutatePriority +import androidx.compose.foundation.MutatorMutex +import androidx.compose.foundation.gestures.ScrollableState +import androidx.compose.foundation.gestures.animateScrollBy +import androidx.compose.foundation.gestures.scrollable +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberUpdatedState +import androidx.compose.ui.geometry.Offset +import kotlinx.coroutines.coroutineScope + +/** + * An object representing something that can be scrolled. This interface is implemented by states + * of scrollable containers such as [androidx.compose.foundation.lazy.LazyListState] or + * [androidx.compose.foundation.ScrollState] in order to provide low-level scrolling control via + * [scroll], as well as allowing for higher-level scrolling functions like + * [animateScrollBy] to be implemented as extension + * functions on [ScrollableState]. + * + * Subclasses may also have their own methods that are specific to their interaction paradigm, such + * as [androidx.compose.foundation.lazy.LazyListState.scrollToItem]. + * + * @see androidx.compose.foundation.gestures.animateScrollBy + * @see androidx.compose.foundation.gestures.scrollable + */ +internal interface Scrollable2DState { + /** + * Call this function to take control of scrolling and gain the ability to send scroll events + * via [ScrollScope.scrollBy]. All actions that change the logical scroll position must be + * performed within a [scroll] block (even if they don't call any other methods on this + * object) in order to guarantee that mutual exclusion is enforced. + * + * If [scroll] is called from elsewhere with the [scrollPriority] higher or equal to ongoing + * scroll, ongoing scroll will be canceled. + */ + suspend fun scroll( + scrollPriority: MutatePriority = MutatePriority.Default, + block: suspend Scroll2DScope.() -> Unit + ) + + /** + * Dispatch scroll delta in pixels avoiding all scroll related mechanisms. + * + * **NOTE:** unlike [scroll], dispatching any delta with this method won't trigger nested + * scroll, won't stop ongoing scroll/drag animation and will bypass scrolling of any priority. + * This method will also ignore `reverseDirection` and other parameters set in scrollable. + * + * This method is used internally for nested scrolling dispatch and other low level + * operations, allowing implementers of [ScrollableState] influence the consumption as suits + * them. Manually dispatching delta via this method will likely result in a bad user experience, + * you must prefer [scroll] method over this one. + * + * @param delta amount of scroll dispatched in the nested scroll process + * + * @return the amount of delta consumed + */ + fun dispatchRawDelta(delta: Offset): Offset + + /** + * Whether this [ScrollableState] is currently scrolling by gesture, fling or programmatically or + * not. + */ + val isScrollInProgress: Boolean + + val canScrollBottom: Boolean + get() = true + + val canScrollTop: Boolean + get() = true + + val canScrollLeft: Boolean + get() = true + + val canScrollRight: Boolean + get() = true +} + +/** + * Default implementation of [ScrollableState] interface that contains necessary information about the + * ongoing fling and provides smooth scrolling capabilities. + * + * This is the simplest way to set up a [scrollable] modifier. When constructing this + * [ScrollableState], you must provide a [consumeScrollDelta] lambda, which will be invoked whenever + * scroll happens (by gesture input, by smooth scrolling, by flinging or nested scroll) with the + * delta in pixels. The amount of scrolling delta consumed must be returned from this lambda to + * ensure proper nested scrolling behaviour. + * + * @param consumeScrollDelta callback invoked when drag/fling/smooth scrolling occurs. The + * callback receives the delta in pixels. Callers should update their state in this lambda and + * return the amount of delta consumed + */ +internal fun Scrollable2DState(consumeScrollDelta: (Offset) -> Offset): Scrollable2DState { + return DefaultScrollable2DState(consumeScrollDelta) +} + +/** + * Create and remember the default implementation of [ScrollableState] interface that contains + * necessary information about the ongoing fling and provides smooth scrolling capabilities. + * + * This is the simplest way to set up a [scrollable] modifier. When constructing this + * [ScrollableState], you must provide a [consumeScrollDelta] lambda, which will be invoked whenever + * scroll happens (by gesture input, by smooth scrolling, by flinging or nested scroll) with the + * delta in pixels. The amount of scrolling delta consumed must be returned from this lambda to + * ensure proper nested scrolling behaviour. + * + * @param consumeScrollDelta callback invoked when drag/fling/smooth scrolling occurs. The + * callback receives the delta in pixels. Callers should update their state in this lambda and + * return the amount of delta consumed + */ +@Composable +internal fun rememberScrollable2DState(consumeScrollDelta: (Offset) -> Offset): Scrollable2DState { + val lambdaState = rememberUpdatedState(consumeScrollDelta) + return remember { Scrollable2DState { lambdaState.value.invoke(it) } } +} + +/** + * Scope used for suspending scroll blocks + */ +internal interface Scroll2DScope { + /** + * Attempts to scroll forward by [pixels] px. + * + * @return the amount of the requested scroll that was consumed (that is, how far it scrolled) + */ + fun scrollBy(pixels: Offset): Offset +} + +internal class DefaultScrollable2DState(val onDelta: (Offset) -> Offset) : Scrollable2DState { + + private val scrollScope: Scroll2DScope = object : Scroll2DScope { + override fun scrollBy(pixels: Offset): Offset { + val coercedPixels = Offset( + x = if (pixels.x.isNaN()) 0f else pixels.x, + y = if (pixels.y.isNaN()) 0f else pixels.y + ) + if (coercedPixels == Offset.Zero) return Offset.Zero + val delta = onDelta(coercedPixels) + return delta + } + } + + private val scrollMutex = MutatorMutex() + + private val isScrollingState = mutableStateOf(false) + + override suspend fun scroll( + scrollPriority: MutatePriority, + block: suspend Scroll2DScope.() -> Unit + ): Unit = coroutineScope { + scrollMutex.mutateWith(scrollScope, scrollPriority) { + isScrollingState.value = true + try { + block() + } finally { + isScrollingState.value = false + } + } + } + + override fun dispatchRawDelta(delta: Offset): Offset { + return onDelta(delta) + } + + override val isScrollInProgress: Boolean + get() = isScrollingState.value +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingNestedScrollConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingNestedScrollConnection.kt index 468d106b9b..eb3b39fddc 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingNestedScrollConnection.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingNestedScrollConnection.kt @@ -6,11 +6,13 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.unit.Velocity import timber.log.Timber -internal class LoggingNestedScrollConnection : NestedScrollConnection { +internal class LoggingNestedScrollConnection( + private val delegateNestedScrollConnection: NestedScrollConnection +) : NestedScrollConnection { override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { - Timber.d("onPostFling $consumed $available") - return super.onPostFling(consumed, available) + Timber.d("onPostFling consumed $consumed, available $available") + return delegateNestedScrollConnection.onPostFling(consumed, available) } override fun onPostScroll( @@ -18,17 +20,17 @@ internal class LoggingNestedScrollConnection : NestedScrollConnection { available: Offset, source: NestedScrollSource ): Offset { - Timber.d("onPostFling $consumed $available $source") - return super.onPostScroll(consumed, available, source) + Timber.d("onPostScroll consumed, $consumed, available $available") + return delegateNestedScrollConnection.onPostScroll(consumed, available, source) } override suspend fun onPreFling(available: Velocity): Velocity { - Timber.d("onPreFling $available") - return super.onPreFling(available) + Timber.d("onPreFling available $available") + return delegateNestedScrollConnection.onPreFling(available) } override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { - Timber.d("onPreScroll $available $source") - return super.onPreScroll(available, source) + Timber.d("onPreScroll available $available") + return delegateNestedScrollConnection.onPreScroll(available, source) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt new file mode 100644 index 0000000000..8a660186ec --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt @@ -0,0 +1,79 @@ +package org.readium.navigator.web.util + +import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.pager.PagerState +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.input.nestedscroll.NestedScrollSource +import androidx.compose.ui.unit.Velocity +import kotlin.math.abs +import kotlin.math.sign +import timber.log.Timber + +internal class PagerNestedConnection( + private val state: PagerState, + private val orientation: Orientation +) : NestedScrollConnection { + + fun Velocity.consumeOnOrientation(orientation: Orientation): Velocity { + return if (orientation == Orientation.Vertical) { + copy(x = 0f) + } else { + copy(y = 0f) + } + } + + val PagerState.firstVisibleOffset get() = + layoutInfo.visiblePagesInfo.first().offset + + val PagerState.lastVisibleOffset get() = + layoutInfo.visiblePagesInfo.last().offset + + override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { + Timber.d("pagerNestedConnection preScroll available $available") + + // rounding and drag only + if (source != NestedScrollSource.UserInput || abs(state.currentPageOffsetFraction) < 1e-6) { + return Offset.Zero + } + + val delta = if (orientation == Orientation.Horizontal) available.x else available.y + + if (delta * state.currentPageOffsetFraction < 0) { + return Offset.Zero + } + + // find the current and next page (in the direction of dragging) + val currentPageOffset = state.currentPageOffsetFraction * state.layoutInfo.pageSize + val pageAvailableSpace = state.layoutInfo.pageSize + state.layoutInfo.pageSpacing + val nextClosestPageOffset = + currentPageOffset + pageAvailableSpace * -sign(state.currentPageOffsetFraction) + + val minBound: Float + val maxBound: Float + // build min and max bounds in absolute coordinates for nested scroll + if (state.currentPageOffsetFraction > 0f) { + minBound = nextClosestPageOffset + maxBound = currentPageOffset + } else { + minBound = currentPageOffset + maxBound = nextClosestPageOffset + } + + Timber.d( + "delta $delta currentPageOffset $currentPageOffset minBound $minBound maxBound $maxBound" + ) + + val coerced = delta.coerceIn(minBound, maxBound) + // dispatch and return reversed as usual + val consumed = -state.dispatchRawDelta(-coerced) + return Offset( + x = if (orientation == Orientation.Horizontal) consumed else available.x, + y = if (orientation == Orientation.Vertical) consumed else available.y + ) + } + + override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { + return available.consumeOnOrientation(orientation) + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewClient.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewClient.kt index 576d69d85c..82a07d98fd 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewClient.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewClient.kt @@ -3,6 +3,7 @@ package org.readium.navigator.web.util import android.webkit.WebResourceRequest import android.webkit.WebResourceResponse import android.webkit.WebView +import org.readium.navigator.web.webview.AccompanistWebViewClient internal class WebViewClient( private val webViewServer: WebViewServer diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewDraggableState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewDraggableState.kt new file mode 100644 index 0000000000..c6b5bc1f58 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewDraggableState.kt @@ -0,0 +1,74 @@ +@file:OptIn(ExperimentalFoundationApi::class) + +package org.readium.navigator.web.util + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.ui.unit.plus +/* +internal class WebViewDraggableState( + private val nestedScrollDispatcher: NestedScrollDispatcher +) : Draggable2DState { + + var webView: RelaxedWebView? = null + + suspend fun onDragStopped(coroutineScope: CoroutineScope, velocity: Velocity) { + nestedScrollDispatcher.coroutineScope.launch { + val preConsumedByParent = nestedScrollDispatcher + .dispatchPreFling(velocity) + val available = velocity - preConsumedByParent + + val consumedPost = + nestedScrollDispatcher.dispatchPostFling( + (available - available), + available + ) + val totalLeft = available - consumedPost + velocity - totalLeft + } + } + + override fun dispatchRawDelta(delta: Offset) { + Timber.d("dispatchRawDelta $delta $this") + val webViewNow = webView ?: return 0f + + val scrollX = webViewNow.scrollX + val maxX = webViewNow.horizontalScrollRange - webViewNow.horizontalScrollExtent + Timber.d("scrollX $scrollX maxX $maxX") + val newX = (scrollX - delta).coerceIn(0f, maxX.toFloat()) + webViewNow.scrollTo(newX.roundToInt(), 0) + val consumed = (scrollX - webViewNow.scrollX).toFloat() + Timber.d("consumed $consumed $this") + return consumed + } + + private val drag2DScope: Drag2DScope = object : Drag2DScope { + override fun dragBy(pixels: Offset) = dispatchDrag(pixels) + } + + private fun Drag2DScope.dispatchDrag(offset: Offset) { + val consumedByPreScroll = nestedScrollDispatcher.dispatchPreScroll(offset, NestedScrollSource.Drag) + + val scrollAvailableAfterPreScroll = offset - consumedByPreScroll + + val consumedBySelfScroll = + dragBy(scrollAvailableAfterPreScroll) + + val deltaAvailableAfterScroll = scrollAvailableAfterPreScroll - consumedBySelfScroll + val consumedByPostScroll = nestedScrollDispatcher.dispatchPostScroll( + consumedBySelfScroll, + deltaAvailableAfterScroll, + NestedScrollSource.Drag + ) + consumedByPreScroll + consumedBySelfScroll + consumedByPostScroll + } + + private val drag2DMutex = MutatorMutex() + + override suspend fun drag( + dragPriority: MutatePriority, + block: suspend Drag2DScope.() -> Unit + ): Unit = coroutineScope { + drag2DMutex.mutateWith(drag2DScope, dragPriority, block) + } +} +*/ diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt new file mode 100644 index 0000000000..242b5e07ea --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt @@ -0,0 +1,57 @@ +package org.readium.navigator.web.util + +import androidx.compose.ui.geometry.Offset +import kotlin.math.roundToInt +import org.readium.navigator.web.gestures.DefaultScrollable2DState +import org.readium.navigator.web.gestures.Scrollable2DState +import org.readium.navigator.web.webview.RelaxedWebView +import timber.log.Timber + +internal class WebViewScrollable2DState private constructor( + private val webViewDeltaDispatcher: WebViewDeltaDispatcher +) : Scrollable2DState by DefaultScrollable2DState(webViewDeltaDispatcher::onDelta) { + + constructor() : this(WebViewDeltaDispatcher()) + + var webView: RelaxedWebView? + get() = + webViewDeltaDispatcher.webView + set(value) { + webViewDeltaDispatcher.webView = value + } +} + +private class WebViewDeltaDispatcher { + + var webView: RelaxedWebView? = null + + fun onDelta(delta: Offset): Offset { + val webViewNow = webView ?: return Offset.Zero + + val currentX = webViewNow.scrollX + val currentY = webViewNow.scrollY + val maxX = webViewNow.horizontalScrollRange - webViewNow.horizontalScrollExtent + val maxY = webViewNow.verticalScrollRange - webViewNow.verticalScrollExtent + + Timber.d("WebViewDeltaDispatcher delta $delta") + Timber.d("WebViewDeltaDispatcher currentScrollX $currentX") + Timber.d("WebViewDeltaDispatcher scrollRangeX ${webViewNow.horizontalScrollRange}") + Timber.d("WebViewDeltaDispatcher scrollExtentX ${webViewNow.horizontalScrollExtent}") + Timber.d("WebViewDeltaDispatcher currentScrollY $currentY") + Timber.d("WebViewDeltaDispatcher currentScrollY $currentY") + + val newX = (currentX - delta.x).coerceIn(0f, maxX.toFloat()) + val newY = (currentY - delta.y).coerceIn(0f, maxY.toFloat()) + webViewNow.scrollTo(newX.roundToInt(), newY.roundToInt()) + // webViewNow.scrollBy(-delta.x.toInt(), delta.y.toInt()) + + Timber.d("WebViewDeltaDispatcher newScrollX ${webViewNow.scrollX}") + Timber.d("WebViewDeltaDispatcher newScrollY ${webViewNow.scrollY}") + + val consumedX = (currentX - webViewNow.scrollX).toFloat() + val consumedY = (currentY - webViewNow.scrollY).toFloat() + val consumed = Offset(consumedX, consumedY) + Timber.d("WebViewDeltaDispatcher consumed $consumed") + return consumed + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollableState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollableState.kt new file mode 100644 index 0000000000..4df361a8d3 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollableState.kt @@ -0,0 +1,68 @@ +package org.readium.navigator.web.util + +import androidx.compose.foundation.MutatePriority +import androidx.compose.foundation.MutatorMutex +import androidx.compose.foundation.gestures.ScrollScope +import androidx.compose.foundation.gestures.ScrollableState +import androidx.compose.runtime.mutableStateOf +import kotlin.math.roundToInt +import kotlinx.coroutines.coroutineScope +import org.readium.navigator.web.webview.RelaxedWebView +import timber.log.Timber + +internal class WebViewScrollableState() : ScrollableState { + + init { + Timber.d("Init $this") + } + + var webView: RelaxedWebView? = null + + override fun dispatchRawDelta(delta: Float): Float { + Timber.d("dispatchRawDelta $delta $this") + val webViewNow = webView ?: return 0f + + val scrollX = webViewNow.scrollX + val maxX = webViewNow.horizontalScrollRange - webViewNow.horizontalScrollExtent + Timber.d("scrollX $scrollX maxX $maxX") + val newX = (scrollX - delta).coerceIn(0f, maxX.toFloat()) + webViewNow.scrollTo(newX.roundToInt(), 0) + val consumed = (scrollX - webViewNow.scrollX).toFloat() + Timber.d("consumed $consumed $this") + return consumed + } + + private val scrollScope: ScrollScope = object : ScrollScope { + override fun scrollBy(pixels: Float): Float { + if (pixels.isNaN()) return 0f + return dispatchRawDelta(pixels) + } + } + + private val scrollMutex = MutatorMutex() + + private val isScrollingState = mutableStateOf(false) + + override suspend fun scroll( + scrollPriority: MutatePriority, + block: suspend ScrollScope.() -> Unit + ): Unit = coroutineScope { + scrollMutex.mutateWith(scrollScope, scrollPriority) { + isScrollingState.value = true + try { + block() + } finally { + isScrollingState.value = false + } + } + } + + override val isScrollInProgress: Boolean + get() = isScrollingState.value + + override val canScrollForward: Boolean + get() = webView?.canScrollHorizontally(1) ?: false + + override val canScrollBackward: Boolean + get() = webView?.canScrollHorizontally(-1) ?: false +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/ComposeWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposeWebView.kt similarity index 97% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/util/ComposeWebView.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposeWebView.kt index 4c99bc1d52..0cc5fee27a 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/ComposeWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposeWebView.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.readium.navigator.web.util +package org.readium.navigator.web.webview import android.content.Context import android.graphics.Bitmap @@ -27,6 +27,7 @@ import android.webkit.WebView import android.webkit.WebViewClient import android.widget.FrameLayout import androidx.activity.compose.BackHandler +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.fillMaxSize @@ -55,8 +56,10 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.readium.navigator.web.util.LoadingState.Finished -import org.readium.navigator.web.util.LoadingState.Loading +import org.readium.navigator.web.gestures.scrollable2D +import org.readium.navigator.web.util.WebViewScrollable2DState +import org.readium.navigator.web.webview.LoadingState.Finished +import org.readium.navigator.web.webview.LoadingState.Loading import timber.log.Timber /** @@ -171,6 +174,7 @@ internal fun WebView( * @param chromeClient Provides access to WebChromeClient via subclassing * @param factory An optional WebView factory for using a custom subclass of WebView */ +@OptIn(ExperimentalFoundationApi::class) @Composable internal fun WebView( state: WebViewState, @@ -237,9 +241,11 @@ internal fun WebView( client.navigator = navigator chromeClient.state = state + val draggableState = remember { WebViewScrollable2DState() } + AndroidView( factory = { context -> - (factory?.invoke(context) ?: LoggingWebView(context)).apply { + (RelaxedWebView(context)).apply { onCreated(this) ViewCompat.setNestedScrollingEnabled(this, true) @@ -251,11 +257,14 @@ internal fun WebView( webChromeClient = chromeClient webViewClient = client + draggableState.webView = this }.also { state.webView = it } }, - modifier = modifier, + modifier = modifier + .scrollable2D(draggableState), onRelease = { onDispose(it) + draggableState.webView = null } ) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/LoggingWebView.kt similarity index 79% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingWebView.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/webview/LoggingWebView.kt index 5ea9dceedd..d74efb3774 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/LoggingWebView.kt @@ -1,4 +1,4 @@ -package org.readium.navigator.web.util +package org.readium.navigator.web.webview import android.annotation.SuppressLint import android.content.Context @@ -6,6 +6,8 @@ import android.view.MotionEvent import android.view.ViewConfiguration import android.webkit.WebView import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher +import androidx.compose.ui.input.nestedscroll.NestedScrollSource import kotlin.math.abs import kotlin.math.sign import kotlinx.coroutines.CoroutineScope @@ -20,6 +22,8 @@ import timber.log.Timber @OptIn(InternalReadiumApi::class) internal class LoggingWebView(context: Context) : WebView(context) { + lateinit var nestedScrollDispatcher: NestedScrollDispatcher + private val coroutineScope: CoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) @@ -83,6 +87,27 @@ internal class LoggingWebView(context: Context) : WebView(context) { val horizontalSign = -sign(currentMoveDelta.x).toInt() val verticalSign = sign(currentMoveDelta.y).toInt() + Timber.d("nestedScrollDispatcher.dispatchPreScroll $currentMoveDelta") + val preconsumed = + nestedScrollDispatcher.dispatchPreScroll( + currentMoveDelta, + NestedScrollSource.Drag + ) + + val remaining = currentMoveDelta - preconsumed + val consumed = Offset(remaining.x.toInt().toFloat(), remaining.y.toInt().toFloat()) + + scrollBy(consumed.x.toInt(), consumed.y.toInt()) + + Timber.d( + "nestedScrollDispatcher.dispatchPostScroll ${preconsumed + consumed} ${remaining - consumed}" + ) + nestedScrollDispatcher.dispatchPostScroll( + preconsumed + consumed, + remaining - consumed, + NestedScrollSource.Drag + ) + val shouldScrollHorizontally = state!!.isHorizontallyScrolling() && canScrollHorizontally(horizontalSign) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/RelaxedWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/RelaxedWebView.kt new file mode 100644 index 0000000000..f5a78f8ee4 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/RelaxedWebView.kt @@ -0,0 +1,19 @@ +package org.readium.navigator.web.webview + +import android.content.Context +import android.webkit.WebView + +internal class RelaxedWebView(context: Context) : WebView(context) { + + val verticalScrollRange: Int get() = + computeVerticalScrollRange() + + val horizontalScrollRange: Int get() = + computeHorizontalScrollRange() + + val verticalScrollExtent: Int get() = + computeVerticalScrollExtent() + + val horizontalScrollExtent: Int get() = + computeHorizontalScrollExtent() +} From 740d109fea7fee6606335dd224d94382ecac221d Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Fri, 19 Jul 2024 13:23:21 +0200 Subject: [PATCH 07/61] Important fixes --- .../web/util/PagerNestedConnection.kt | 24 ++++++++++++----- .../web/util/WebViewScrollable2DState.kt | 26 ++++++++++++++----- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt index 8a660186ec..6716d8bdf4 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt @@ -7,7 +7,6 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.unit.Velocity import kotlin.math.abs -import kotlin.math.sign import timber.log.Timber internal class PagerNestedConnection( @@ -32,6 +31,11 @@ internal class PagerNestedConnection( override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { Timber.d("pagerNestedConnection preScroll available $available") + if (state.layoutInfo.visiblePagesInfo.size <= 1) { + Timber.d("pagerNestedConnection only one page $available") + return Offset.Zero + } + // rounding and drag only if (source != NestedScrollSource.UserInput || abs(state.currentPageOffsetFraction) < 1e-6) { return Offset.Zero @@ -39,10 +43,11 @@ internal class PagerNestedConnection( val delta = if (orientation == Orientation.Horizontal) available.x else available.y - if (delta * state.currentPageOffsetFraction < 0) { - return Offset.Zero - } + val minBound = -(state.layoutInfo.pageSize + state.firstVisibleOffset).toFloat() + + val maxBound = (state.layoutInfo.pageSize - state.lastVisibleOffset).toFloat() + /* // find the current and next page (in the direction of dragging) val currentPageOffset = state.currentPageOffsetFraction * state.layoutInfo.pageSize val pageAvailableSpace = state.layoutInfo.pageSize + state.layoutInfo.pageSpacing @@ -60,13 +65,18 @@ internal class PagerNestedConnection( maxBound = nextClosestPageOffset } - Timber.d( - "delta $delta currentPageOffset $currentPageOffset minBound $minBound maxBound $maxBound" - ) + + */ + + Timber.d("delta $delta minBound $minBound maxBound $maxBound") val coerced = delta.coerceIn(minBound, maxBound) // dispatch and return reversed as usual val consumed = -state.dispatchRawDelta(-coerced) + + Timber.d("consumed $consumed") + + check(state.layoutInfo.visiblePagesInfo.size == 1 || abs(consumed - available.x) < 1) return Offset( x = if (orientation == Orientation.Horizontal) consumed else available.x, y = if (orientation == Orientation.Vertical) consumed else available.y diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt index 242b5e07ea..7c8e7d00e5 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt @@ -1,7 +1,9 @@ package org.readium.navigator.web.util import androidx.compose.ui.geometry.Offset -import kotlin.math.roundToInt +import kotlin.math.abs +import kotlin.math.ceil +import kotlin.math.sign import org.readium.navigator.web.gestures.DefaultScrollable2DState import org.readium.navigator.web.gestures.Scrollable2DState import org.readium.navigator.web.webview.RelaxedWebView @@ -40,18 +42,30 @@ private class WebViewDeltaDispatcher { Timber.d("WebViewDeltaDispatcher currentScrollY $currentY") Timber.d("WebViewDeltaDispatcher currentScrollY $currentY") - val newX = (currentX - delta.x).coerceIn(0f, maxX.toFloat()) - val newY = (currentY - delta.y).coerceIn(0f, maxY.toFloat()) - webViewNow.scrollTo(newX.roundToInt(), newY.roundToInt()) + // Consume slightly more than delta si we have to because + // we don't want the pager to consume any rounding error + val newX = (currentX - sign(delta.x) * ceil(abs(delta.x))).toInt().coerceIn(0, maxX) + val newY = (currentY - sign(delta.y) * ceil(abs(delta.y))).toInt().coerceIn(0, maxY) + webViewNow.scrollTo(newX, newY) // webViewNow.scrollBy(-delta.x.toInt(), delta.y.toInt()) Timber.d("WebViewDeltaDispatcher newScrollX ${webViewNow.scrollX}") Timber.d("WebViewDeltaDispatcher newScrollY ${webViewNow.scrollY}") - val consumedX = (currentX - webViewNow.scrollX).toFloat() - val consumedY = (currentY - webViewNow.scrollY).toFloat() + // Fake that we never consume more than delta + val consumedX = (currentX - webViewNow.scrollX).toFloat().coerceAbsAtMost(abs(delta.x)) + val consumedY = (currentY - webViewNow.scrollY).toFloat().coerceAbsAtMost(abs(delta.y)) val consumed = Offset(consumedX, consumedY) Timber.d("WebViewDeltaDispatcher consumed $consumed") return consumed } + + private fun Float.coerceAbsAtMost(maxValue: Float): Float { + require(maxValue >= 0) + return if (this > 0) { + this.coerceAtMost(maxValue) + } else { + this.coerceAtLeast(-maxValue) + } + } } From 92ef77668109e2796d7bc3b441d45583baf62eba Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Tue, 23 Jul 2024 09:28:07 +0200 Subject: [PATCH 08/61] Fix fling removing it between spreads --- .../readium/navigator/web/NavigatorView.kt | 41 ++---------------- .../navigator/web/gestures/Scrollable2D.kt | 42 ++++++++++++++++++- .../web/util/PagerNestedConnection.kt | 21 ++++++++-- .../navigator/web/webview/ComposeWebView.kt | 6 ++- 4 files changed, 66 insertions(+), 44 deletions(-) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt index 9ffe2d5eb8..f643ebda8e 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt @@ -9,7 +9,6 @@ import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.NestedScrollConnection -import androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher import org.readium.navigator.web.util.LoggingNestedScrollConnection import org.readium.navigator.web.util.PagerNestedConnection import org.readium.navigator.web.util.WebViewServer @@ -31,31 +30,7 @@ public fun NavigatorView( } HorizontalPager( - modifier = modifier/*.nestedScroll(object : NestedScrollConnection { - - override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { - Timber.d("onPreScroll $available") - return Offset.Zero - } - - override fun onPostScroll( - consumed: Offset, - available: Offset, - source: NestedScrollSource - ): Offset { - Timber.d("onPostScroll $consumed $available") - return Offset(pagerState.dispatchRawDelta(available.x), 0f) - } - - override suspend fun onPreFling(available: Velocity): Velocity { - return Velocity.Zero - } - - override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { - return available - - - })*/, + modifier = modifier, userScrollEnabled = true, state = pagerState, beyondViewportPageCount = 2, @@ -68,19 +43,9 @@ public fun NavigatorView( is LayoutResolver.Spread.Single -> { val url = WebViewServer.publicationBaseHref.resolve(it.url).toString() val webViewState = rememberWebViewState(url) - val nestedScrollDispatcher = NestedScrollDispatcher() WebView( - modifier = Modifier.fillMaxSize(), - /* .nestedScroll(object : NestedScrollConnection { - - override suspend fun onPostFling( - consumed: Velocity, - available: Velocity - ): Velocity { - return available - } - }),*/ - // .nestedScroll(NoOpScrollConnection, nestedScrollDispatcher), + modifier = Modifier + .fillMaxSize(), state = webViewState, client = state.webViewClient, onCreated = { webview -> diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt index f981b9e2a1..48c27b09ef 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt @@ -1,10 +1,12 @@ package org.readium.navigator.web.gestures +import androidx.compose.animation.core.AnimationState import androidx.compose.animation.core.AnimationVector2D import androidx.compose.animation.core.DecayAnimationSpec import androidx.compose.animation.core.TwoWayConverter import androidx.compose.animation.core.VectorConverter import androidx.compose.animation.core.animate +import androidx.compose.animation.core.animateDecay import androidx.compose.animation.rememberSplineBasedDecay import androidx.compose.animation.splineBasedDecay import androidx.compose.foundation.ExperimentalFoundationApi @@ -56,7 +58,10 @@ import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.Velocity import androidx.compose.ui.util.fastAll import androidx.compose.ui.util.fastForEach +import kotlin.coroutines.cancellation.CancellationException +import kotlin.math.abs import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import timber.log.Timber /** @@ -700,8 +705,41 @@ internal class DefaultFling2DBehavior( private val motionDurationScale: MotionDurationScale = DefaultScrollMotionDurationScale ) : Fling2DBehavior { + // For Testing + var lastAnimationCycleCount = 0 + override suspend fun Scroll2DScope.performFling(initialVelocity: Velocity): Velocity { - return Velocity.Zero + lastAnimationCycleCount = 0 + // come up with the better threshold, but we need it since spline curve gives us NaNs + return withContext(motionDurationScale) { + if (abs(initialVelocity.x) > 1f || abs(initialVelocity.y) > 1f) { + var velocityLeft = Offset(initialVelocity.x, initialVelocity.y) + var lastValue = Offset.Zero + val animationState = AnimationState( + typeConverter = Offset.VectorConverter, + initialValue = Offset.Zero, + initialVelocityVector = AnimationVector2D(initialVelocity.x, initialVelocity.y) + ) + try { + animationState.animateDecay(flingDecay) { + val delta = value - lastValue + val consumed = scrollBy(delta) + lastValue = value + velocityLeft = this.velocity + // avoid rounding errors and stop if anything is unconsumed + if (abs(delta.x - consumed.x) > 0.5f && abs(delta.y - consumed.y) > 0.5f) { + this.cancelAnimation() + } + lastAnimationCycleCount++ + } + } catch (exception: CancellationException) { + velocityLeft = animationState.velocity + } + Velocity(velocityLeft.x, velocityLeft.y) + } else { + initialVelocity + } + } } } @@ -730,7 +768,7 @@ internal class ScrollableContainerNode(enabled: Boolean) : } } -private val UnityDensity = object : Density { +internal val UnityDensity = object : Density { override val density: Float get() = 1f override val fontScale: Float diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt index 6716d8bdf4..fd52f0d6a3 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt @@ -7,6 +7,7 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.unit.Velocity import kotlin.math.abs +import kotlinx.coroutines.CancellationException import timber.log.Timber internal class PagerNestedConnection( @@ -14,7 +15,7 @@ internal class PagerNestedConnection( private val orientation: Orientation ) : NestedScrollConnection { - fun Velocity.consumeOnOrientation(orientation: Orientation): Velocity { + private fun Velocity.consumeOnOrientation(orientation: Orientation): Velocity { return if (orientation == Orientation.Vertical) { copy(x = 0f) } else { @@ -22,10 +23,13 @@ internal class PagerNestedConnection( } } - val PagerState.firstVisibleOffset get() = + private fun Offset.mainAxis(): Float = + if (orientation == Orientation.Horizontal) this.x else this.y + + private val PagerState.firstVisibleOffset get() = layoutInfo.visiblePagesInfo.first().offset - val PagerState.lastVisibleOffset get() = + private val PagerState.lastVisibleOffset get() = layoutInfo.visiblePagesInfo.last().offset override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { @@ -83,6 +87,17 @@ internal class PagerNestedConnection( ) } + override fun onPostScroll( + consumed: Offset, + available: Offset, + source: NestedScrollSource + ): Offset { + if (source == NestedScrollSource.SideEffect && available.mainAxis() != 0f) { + throw CancellationException() + } + return Offset.Zero + } + override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { return available.consumeOnOrientation(orientation) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposeWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposeWebView.kt index 0cc5fee27a..666a3e8322 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposeWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposeWebView.kt @@ -56,6 +56,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import org.readium.navigator.web.gestures.Fling2DBehavior import org.readium.navigator.web.gestures.scrollable2D import org.readium.navigator.web.util.WebViewScrollable2DState import org.readium.navigator.web.webview.LoadingState.Finished @@ -91,6 +92,7 @@ internal fun WebView( state: WebViewState, modifier: Modifier = Modifier, captureBackPresses: Boolean = true, + flingBehavior: Fling2DBehavior? = null, navigator: WebViewNavigator = rememberWebViewNavigator(), onCreated: (WebView) -> Unit = {}, onDispose: (WebView) -> Unit = {}, @@ -134,6 +136,7 @@ internal fun WebView( item { WebView( state, + flingBehavior, layoutParams, Modifier.fillParentMaxSize(), captureBackPresses, @@ -178,6 +181,7 @@ internal fun WebView( @Composable internal fun WebView( state: WebViewState, + flingBehavior: Fling2DBehavior?, layoutParams: FrameLayout.LayoutParams, modifier: Modifier = Modifier, captureBackPresses: Boolean = true, @@ -261,7 +265,7 @@ internal fun WebView( }.also { state.webView = it } }, modifier = modifier - .scrollable2D(draggableState), + .scrollable2D(draggableState, flingBehavior = flingBehavior), onRelease = { onDispose(it) draggableState.webView = null From 479ba7f6caff8377df1a15efcacadc94144024c3 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 24 Jul 2024 11:32:52 +0200 Subject: [PATCH 09/61] Seems to fix fling --- .../readium/navigator/web/NavigatorView.kt | 18 ++++++++++--- .../navigator/web/gestures/Scrollable2D.kt | 25 +++++++++++++------ .../web/util/LoggingTargetedFlingBehavior.kt | 20 +++++++++++++++ .../web/util/PagerNestedConnection.kt | 8 +++--- .../web/util/WebViewScrollable2DState.kt | 2 +- 5 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingTargetedFlingBehavior.kt diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt index f643ebda8e..2d529e2004 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt @@ -5,11 +5,14 @@ import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.PagerDefaults +import androidx.compose.foundation.pager.PagerSnapDistance import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import org.readium.navigator.web.util.LoggingNestedScrollConnection +import org.readium.navigator.web.util.LoggingTargetedFlingBehavior import org.readium.navigator.web.util.PagerNestedConnection import org.readium.navigator.web.util.WebViewServer import org.readium.navigator.web.webview.WebView @@ -34,14 +37,21 @@ public fun NavigatorView( userScrollEnabled = true, state = pagerState, beyondViewportPageCount = 2, - pageNestedScrollConnection = - LoggingNestedScrollConnection(PagerNestedConnection(pagerState, Orientation.Horizontal)) + flingBehavior = LoggingTargetedFlingBehavior( + PagerDefaults.flingBehavior( + state = pagerState, + pagerSnapDistance = PagerSnapDistance.atMost(0) + ) + ), + pageNestedScrollConnection = LoggingNestedScrollConnection( + PagerNestedConnection(pagerState, Orientation.Horizontal) + ) ) { - when (val it = state.spreads.value[it]) { + when (val spread = state.spreads.value[it]) { is LayoutResolver.Spread.Double -> throw NotImplementedError() is LayoutResolver.Spread.Single -> { - val url = WebViewServer.publicationBaseHref.resolve(it.url).toString() + val url = WebViewServer.publicationBaseHref.resolve(spread.url).toString() val webViewState = rememberWebViewState(url) WebView( modifier = Modifier diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt index 48c27b09ef..d7a9b6528e 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt @@ -585,6 +585,8 @@ internal class ScrollingLogic( val velocityLeft = doFlingAnimation(available) + Timber.d("dispatchPostFling available $available left $velocityLeft") + val consumedPost = nestedScrollDispatcher.dispatchPostFling( (available - velocityLeft), @@ -604,13 +606,16 @@ internal class ScrollingLogic( suspend fun doFlingAnimation(available: Velocity): Velocity { var result: Velocity = available - scroll(scrollPriority = MutatePriority.Default) { - val nestedScrollScope = this + + // Unlike the scrollable modifier, we bypass nested scroll while performing fling + // so that nested scroll is more predictable : ancestors do not get called while + // this is performing fling, only preFling beforehand and postFling afterwards. + scrollableState.scroll(scrollPriority = MutatePriority.Default) { + val scrollScope = this val reverseScope = object : Scroll2DScope { override fun scrollBy(pixels: Offset): Offset { - return nestedScrollScope.scrollByWithOverscroll( - offset = pixels.reverseIfNeeded(), - source = NestedScrollSource.SideEffect + return scrollScope.scrollBy( + pixels = pixels.reverseIfNeeded() ).reverseIfNeeded() } } @@ -715,6 +720,7 @@ internal class DefaultFling2DBehavior( if (abs(initialVelocity.x) > 1f || abs(initialVelocity.y) > 1f) { var velocityLeft = Offset(initialVelocity.x, initialVelocity.y) var lastValue = Offset.Zero + var hasStarted = false val animationState = AnimationState( typeConverter = Offset.VectorConverter, initialValue = Offset.Zero, @@ -724,13 +730,18 @@ internal class DefaultFling2DBehavior( animationState.animateDecay(flingDecay) { val delta = value - lastValue val consumed = scrollBy(delta) + Timber.d("animationStep $delta $consumed") lastValue = value velocityLeft = this.velocity - // avoid rounding errors and stop if anything is unconsumed - if (abs(delta.x - consumed.x) > 0.5f && abs(delta.y - consumed.y) > 0.5f) { + // avoid rounding errors and stop if anything is unconsumed on both axes + val unconsumedX = abs(delta.x) <= 0.5f || abs(delta.x - consumed.x) > 0.5f + val unconsumedY = abs(delta.y) <= 0.5f || abs(delta.y - consumed.y) > 0.5f + if (hasStarted && unconsumedX && unconsumedY) { + Timber.d("delta $delta consumed $consumed") this.cancelAnimation() } lastAnimationCycleCount++ + hasStarted = true } } catch (exception: CancellationException) { velocityLeft = animationState.velocity diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingTargetedFlingBehavior.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingTargetedFlingBehavior.kt new file mode 100644 index 0000000000..b0b12d2042 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingTargetedFlingBehavior.kt @@ -0,0 +1,20 @@ +package org.readium.navigator.web.util + +import androidx.compose.foundation.gestures.ScrollScope +import androidx.compose.foundation.gestures.TargetedFlingBehavior +import timber.log.Timber + +internal class LoggingTargetedFlingBehavior( + private val delegate: TargetedFlingBehavior +) : TargetedFlingBehavior { + + override suspend fun ScrollScope.performFling( + initialVelocity: Float, + onRemainingDistanceUpdated: (Float) -> Unit + ): Float { + Timber.d("performFling $initialVelocity") + return with(delegate) { + performFling(initialVelocity, onRemainingDistanceUpdated) + } + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt index fd52f0d6a3..8d3d7aeefd 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt @@ -7,7 +7,6 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.unit.Velocity import kotlin.math.abs -import kotlinx.coroutines.CancellationException import timber.log.Timber internal class PagerNestedConnection( @@ -87,7 +86,7 @@ internal class PagerNestedConnection( ) } - override fun onPostScroll( + /*override fun onPostScroll( consumed: Offset, available: Offset, source: NestedScrollSource @@ -96,9 +95,10 @@ internal class PagerNestedConnection( throw CancellationException() } return Offset.Zero - } + }*/ override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { - return available.consumeOnOrientation(orientation) + return Velocity.Zero + // return available.consumeOnOrientation(orientation) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt index 7c8e7d00e5..510a92f51d 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt @@ -39,7 +39,7 @@ private class WebViewDeltaDispatcher { Timber.d("WebViewDeltaDispatcher currentScrollX $currentX") Timber.d("WebViewDeltaDispatcher scrollRangeX ${webViewNow.horizontalScrollRange}") Timber.d("WebViewDeltaDispatcher scrollExtentX ${webViewNow.horizontalScrollExtent}") - Timber.d("WebViewDeltaDispatcher currentScrollY $currentY") + Timber.d("WebViewDeltaDispatcher currentScrollX $currentX") Timber.d("WebViewDeltaDispatcher currentScrollY $currentY") // Consume slightly more than delta si we have to because From a54583dca72663a587b4b35721fef4f50d54e1bd Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 24 Jul 2024 12:51:41 +0200 Subject: [PATCH 10/61] Prioritize snapping over Webview flinging --- .../readium/navigator/web/NavigatorView.kt | 16 ++++++++------- .../navigator/web/gestures/Scrollable2D.kt | 2 ++ .../web/util/PagerNestedConnection.kt | 20 +++++++++++++++++++ 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt index 2d529e2004..b7323b29b8 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt @@ -32,19 +32,21 @@ public fun NavigatorView( state.spreads.value.size } + val flingBehavior = LoggingTargetedFlingBehavior( + PagerDefaults.flingBehavior( + state = pagerState, + pagerSnapDistance = PagerSnapDistance.atMost(0) + ) + ) + HorizontalPager( modifier = modifier, userScrollEnabled = true, state = pagerState, beyondViewportPageCount = 2, - flingBehavior = LoggingTargetedFlingBehavior( - PagerDefaults.flingBehavior( - state = pagerState, - pagerSnapDistance = PagerSnapDistance.atMost(0) - ) - ), + flingBehavior = flingBehavior, pageNestedScrollConnection = LoggingNestedScrollConnection( - PagerNestedConnection(pagerState, Orientation.Horizontal) + PagerNestedConnection(pagerState, flingBehavior, Orientation.Horizontal) ) ) { when (val spread = state.spreads.value[it]) { diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt index d7a9b6528e..a99e7fcba1 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt @@ -287,9 +287,11 @@ private class Scrollable2DNode( override suspend fun drag( forEachDelta: suspend ((dragDelta: DragEvent.DragDelta) -> Unit) -> Unit ) { + Timber.d("drag") with(scrollingLogic) { scroll(scrollPriority = MutatePriority.UserInput) { forEachDelta { + Timber.d("forEachDelta ${it.delta} $this@with") scrollByWithOverscroll( it.delta, source = NestedScrollSource.UserInput diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt index 8d3d7aeefd..660f651c75 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt @@ -1,6 +1,7 @@ package org.readium.navigator.web.util import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.gestures.TargetedFlingBehavior import androidx.compose.foundation.pager.PagerState import androidx.compose.ui.geometry.Offset import androidx.compose.ui.input.nestedscroll.NestedScrollConnection @@ -11,6 +12,7 @@ import timber.log.Timber internal class PagerNestedConnection( private val state: PagerState, + private val flingBehavior: TargetedFlingBehavior, private val orientation: Orientation ) : NestedScrollConnection { @@ -86,6 +88,24 @@ internal class PagerNestedConnection( ) } + override suspend fun onPreFling(available: Velocity): Velocity { + if (state.layoutInfo.visiblePagesInfo.size <= 1) { + return Velocity.Zero + } + var remaining: Float = available.x + state.scroll { + with(flingBehavior) { + remaining = -performFling(-available.x) + } + } + + if ((available.x - remaining).isNaN()) { + return available + } + + return Velocity(available.x - remaining, available.y) + } + /*override fun onPostScroll( consumed: Offset, available: Offset, From e9b0adc0769d47f7d0ab67f0527ef93911295189 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 24 Jul 2024 17:58:55 +0200 Subject: [PATCH 11/61] Clean up --- .../readium/navigator/web/NavigatorView2.kt | 83 -- .../navigator/web/util/GestureDetector.kt | 724 ------------------ 2 files changed, 807 deletions(-) delete mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView2.kt delete mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/GestureDetector.kt diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView2.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView2.kt deleted file mode 100644 index d2ea397022..0000000000 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView2.kt +++ /dev/null @@ -1,83 +0,0 @@ -package org.readium.navigator.web - -import android.annotation.SuppressLint -import android.webkit.WebResourceRequest -import android.webkit.WebResourceResponse -import android.webkit.WebView -import android.webkit.WebViewClient -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.lazy.LazyRow -import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.viewinterop.AndroidView -import org.readium.navigator.web.util.WebViewServer -import org.readium.navigator.web.webview.rememberWebViewState -import org.readium.r2.shared.ExperimentalReadiumApi -import timber.log.Timber - -@OptIn(ExperimentalFoundationApi::class) -@SuppressLint("SetJavaScriptEnabled") -@ExperimentalReadiumApi -@Composable -public fun NavigatorView2( - modifier: Modifier, - state: NavigatorState -) { - val listState = rememberLazyListState() - val flingBehavior = rememberSnapFlingBehavior(lazyListState = listState) - - LazyRow( - modifier = modifier, - userScrollEnabled = true, - state = listState, - flingBehavior = flingBehavior - ) { - items(state.spreads.value) { - when (it) { - is LayoutResolver.Spread.Double -> - throw NotImplementedError() - is LayoutResolver.Spread.Single -> { - val url = WebViewServer.publicationBaseHref.resolve(it.url).toString() - val webViewState = rememberWebViewState(url) - - AndroidView( - factory = { context -> - android.webkit.WebView(context).apply { - Timber.d("WebView onCreate $url") - settings.javaScriptEnabled = true - settings.setSupportZoom(true) - settings.builtInZoomControls = true - settings.displayZoomControls = false - settings.loadWithOverviewMode = true - settings.useWideViewPort = true - isVerticalScrollBarEnabled = false - isHorizontalScrollBarEnabled = false - webViewClient = object : WebViewClient() { - - override fun shouldInterceptRequest( - view: WebView, - request: WebResourceRequest - ): WebResourceResponse? { - return state.webViewServer.shouldInterceptRequest(request) - } - } - } - }, - modifier = Modifier - .fillMaxSize(), - update = { webView -> webView.loadUrl(url) }, - onReset = { webView -> - webView.stopLoading() - webView.loadUrl("about:blank") - webView.clearHistory() - } - ) - } - } - } - } -} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/GestureDetector.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/GestureDetector.kt deleted file mode 100644 index 4a95111150..0000000000 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/GestureDetector.kt +++ /dev/null @@ -1,724 +0,0 @@ -/* -@file:OptIn(InternalReadiumApi::class) - -package org.readium.navigator.web.util - -import android.content.Context -import android.graphics.PointF -import android.os.Handler -import android.os.Message -import android.os.StrictMode -import android.view.GestureDetector -import android.view.MotionEvent -import android.view.VelocityTracker -import android.view.ViewConfiguration -import kotlin.math.abs -import org.json.JSONObject -import org.readium.r2.shared.InternalReadiumApi -import org.readium.r2.shared.extensions.optNullableString -import org.readium.r2.shared.extensions.tryOrNull -import timber.log.Timber - -internal class GestureDetectors( - private val contextClickListener: ContextClickListener? = null, - private val doubleTapListener: DoubleTapListener? = null, - private val gestureListener: GestureListener? = null -) { - - interface ContextClickListener { - - fun onContextClick() - } - - interface DoubleTapListener { - - fun onDoubleTap() - - fun onDoubleTapEvent() - - fun onSignelTapConfirmed() - } - - interface GestureListener { - - fun onDown() - - fun onFling(velocityX: Float, velocityY: Float) - - fun onScroll(distanceX: Float, distanceY: Float) - } - - @UnsupportedAppUsage - private var mTouchSlopSquare = 0 - private var mDoubleTapTouchSlopSquare = 0 - private var mDoubleTapSlopSquare = 0 - private var mAmbiguousGestureMultiplier = 0f - - @UnsupportedAppUsage - private var mMinimumFlingVelocity = 0 - private var mMaximumFlingVelocity = 0 - - private var mHandler: Handler? = null - - private var mStillDown = false - private var mDeferConfirmSingleTap = false - private var mInLongPress = false - private var mInContextClick = false - - @UnsupportedAppUsage - private var mAlwaysInTapRegion = false - private var mAlwaysInBiggerTapRegion = false - private var mIgnoreNextUpEvent = false - - // Whether a classification has been recorded by statsd for the current event stream. Reset on - // ACTION_DOWN. - private var mHasRecordedClassification = false - - private var mCurrentDownEvent: MotionEvent? = null - private var mCurrentMotionEvent: MotionEvent? = null - private var mPreviousUpEvent: MotionEvent? = null - - */ -/** - * True when the user is still touching for the second tap (down, move, and - * up events). Can only be true if there is a double tap listener attached. - *//* - - private var mIsDoubleTapping = false - - private var mLastFocusX = 0f - private var mLastFocusY = 0f - private var mDownFocusX = 0f - private var mDownFocusY = 0f - - */ -/** - * @return true if longpress is enabled, else false. - *//* - - */ -/** - * Set whether longpress is enabled, if this is enabled when a user - * presses and holds down you get a longpress event and nothing further. - * If it's disabled the user can press and hold down and then later - * moved their finger and you will get scroll events. By default - * longpress is enabled. - * - * @param isLongpressEnabled whether longpress should be enabled. - *//* - - var isLongpressEnabled: Boolean = false - - */ -/** - * Determines speed during touch scrolling - *//* - - private var mVelocityTracker: VelocityTracker? = null - - */ -/** - * Consistency verifier for debugging purposes. - *//* - - private val mInputEventConsistencyVerifier: InputEventConsistencyVerifier? = - if (InputEventConsistencyVerifier.isInstrumentationEnabled()) InputEventConsistencyVerifier( - this, 0 - ) else null - - private inner class GestureHandler : Handler { - - constructor(handler: Handler) : super(handler.looper) - - override fun handleMessage(msg: Message) { - when (msg.what) { - android.view.GestureDetector.Companion.SHOW_PRESS -> mListener!!.onShowPress( - mCurrentDownEvent!! - ) - - android.view.GestureDetector.Companion.LONG_PRESS -> { - recordGestureClassification(msg.arg1) - dispatchLongPress() - } - - android.view.GestureDetector.Companion.TAP -> // If the user's finger is still down, do not count it as a tap - if (mDoubleTapListener != null) { - if (!mStillDown) { - recordGestureClassification( - TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__SINGLE_TAP - ) - mDoubleTapListener!!.onSingleTapConfirmed(mCurrentDownEvent!!) - } else { - mDeferConfirmSingleTap = true - } - } - - else -> throw RuntimeException("Unknown message $msg") //never - - } - } - } - - init { - if (handler != null) { - mHandler = GestureHandler(handler) - } else { - mHandler = GestureHandler() - } - mListener = listener - if (listener is android.view.GestureDetector.OnDoubleTapListener) { - setOnDoubleTapListener(listener as android.view.GestureDetector.OnDoubleTapListener) - } - if (listener is android.view.GestureDetector.OnContextClickListener) { - setContextClickListener(listener as android.view.GestureDetector.OnContextClickListener) - } - init(context) - } - - private fun init(@UiContext context: Context?) { - if (mListener == null) { - throw NullPointerException("OnGestureListener must not be null") - } - isLongpressEnabled = true - - // Fallback to support pre-donuts releases - val touchSlop: Int - val doubleTapSlop: Int - val doubleTapTouchSlop: Int - if (context == null) { - touchSlop = ViewConfiguration.getTouchSlop() - doubleTapTouchSlop = touchSlop // Hack rather than adding a hidden method for this - doubleTapSlop = ViewConfiguration.getDoubleTapSlop() - mMinimumFlingVelocity = ViewConfiguration.getMinimumFlingVelocity() - mMaximumFlingVelocity = ViewConfiguration.getMaximumFlingVelocity() - mAmbiguousGestureMultiplier = ViewConfiguration.getAmbiguousGestureMultiplier() - } else { - StrictMode.assertConfigurationContext(context, "GestureDetector#init") - val configuration = ViewConfiguration.get(context) - touchSlop = configuration.scaledTouchSlop - doubleTapTouchSlop = configuration.getScaledDoubleTapTouchSlop() - doubleTapSlop = configuration.scaledDoubleTapSlop - mMinimumFlingVelocity = configuration.scaledMinimumFlingVelocity - mMaximumFlingVelocity = configuration.scaledMaximumFlingVelocity - mAmbiguousGestureMultiplier = configuration.scaledAmbiguousGestureMultiplier - } - mTouchSlopSquare = touchSlop * touchSlop - mDoubleTapTouchSlopSquare = doubleTapTouchSlop * doubleTapTouchSlop - mDoubleTapSlopSquare = doubleTapSlop * doubleTapSlop - } - - */ -/** - * Analyzes the given motion event and if applicable triggers the - * appropriate callbacks on the [OnGestureListener] supplied. - * - * @param ev The current motion event. - * @return true if the [OnGestureListener] consumed the event, - * else false. - *//* - - fun onTouchEvent(ev: MotionEvent): Boolean { - val action = ev.action - - if (mCurrentMotionEvent != null) { - mCurrentMotionEvent!!.recycle() - } - mCurrentMotionEvent = MotionEvent.obtain(ev) - - if (mVelocityTracker == null) { - mVelocityTracker = VelocityTracker.obtain() - } - mVelocityTracker!!.addMovement(ev) - - val pointerUp = - (action and MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_UP - val skipIndex = if (pointerUp) ev.actionIndex else -1 - val isGeneratedGesture = - (ev.flags and MotionEvent.FLAG_IS_GENERATED_GESTURE) !== 0 - - // Determine focal point - var sumX = 0f - var sumY = 0f - val count = ev.pointerCount - for (i in 0 until count) { - if (skipIndex == i) continue - sumX += ev.getX(i) - sumY += ev.getY(i) - } - val div = if (pointerUp) count - 1 else count - val focusX = sumX / div - val focusY = sumY / div - - var handled = false - - when (action and MotionEvent.ACTION_MASK) { - MotionEvent.ACTION_POINTER_DOWN -> { - run { - mLastFocusX = focusX - mDownFocusX = mLastFocusX - } - run { - mLastFocusY = focusY - mDownFocusY = mLastFocusY - } - // Cancel long press and taps - cancelTaps() - } - - MotionEvent.ACTION_POINTER_UP -> { - run { - mLastFocusX = focusX - mDownFocusX = mLastFocusX - } - run { - mLastFocusY = focusY - mDownFocusY = mLastFocusY - } - // Check the dot product of current velocities. - // If the pointer that left was opposing another velocity vector, clear. - mVelocityTracker!!.computeCurrentVelocity(1000, mMaximumFlingVelocity.toFloat()) - val upIndex = ev.actionIndex - val id1 = ev.getPointerId(upIndex) - val x1 = mVelocityTracker!!.getXVelocity(id1) - val y1 = mVelocityTracker!!.getYVelocity(id1) - var i = 0 - while (i < count) { - if (i == upIndex) { - i++ - continue - } - - val id2 = ev.getPointerId(i) - val x = x1 * mVelocityTracker!!.getXVelocity(id2) - val y = y1 * mVelocityTracker!!.getYVelocity(id2) - - val dot = x + y - if (dot < 0) { - mVelocityTracker!!.clear() - break - } - i++ - } - } - - MotionEvent.ACTION_DOWN -> { - if (doubleTapListener != null) { - val hadTapMessage = - mHandler!!.hasMessages(TAP) - if (hadTapMessage) mHandler!!.removeMessages(TAP) - if ((mCurrentDownEvent != null) && (mPreviousUpEvent != null) - && hadTapMessage - && isConsideredDoubleTap(mCurrentDownEvent!!, mPreviousUpEvent!!, ev) - ) { - // This is a second tap - mIsDoubleTapping = true - // Give a callback with the first tap of the double-tap - handled = - handled or doubleTapListener.onDoubleTap(mCurrentDownEvent!!) - // Give a callback with down event of the double-tap - handled = handled or doubleTapListener.onDoubleTapEvent(ev) - } else { - // This is a first tap - mHandler!!.sendEmptyMessageDelayed( - TAP, - DOUBLE_TAP_TIMEOUT.toLong() - ) - } - } - - mLastFocusX = focusX - mDownFocusX = mLastFocusX - - mLastFocusY = focusY - mDownFocusY = mLastFocusY - - if (mCurrentDownEvent != null) { - mCurrentDownEvent!!.recycle() - } - mCurrentDownEvent = MotionEvent.obtain(ev) - mAlwaysInTapRegion = true - mAlwaysInBiggerTapRegion = true - mStillDown = true - mInLongPress = false - mDeferConfirmSingleTap = false - mHasRecordedClassification = false - - if (isLongpressEnabled) { - mHandler!!.removeMessages(LONG_PRESS) - mHandler!!.sendMessageAtTime( - mHandler!!.obtainMessage( - LONG_PRESS, - TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__LONG_PRESS, - 0 */ -/* arg2 *//* - - ), - mCurrentDownEvent.getDownTime() - + ViewConfiguration.getLongPressTimeout() - ) - } - mHandler!!.sendEmptyMessageAtTime( - SHOW_PRESS, - mCurrentDownEvent.getDownTime() + TAP_TIMEOUT - ) - handled = handled or mListener!!.onDown(ev) - } - - MotionEvent.ACTION_MOVE -> { - if (mInLongPress || mInContextClick) { - break - } - - val motionClassification = ev.classification - val hasPendingLongPress = - mHandler!!.hasMessages(LONG_PRESS) - - val scrollX = mLastFocusX - focusX - val scrollY = mLastFocusY - focusY - if (mIsDoubleTapping) { - // Give the move events of the double-tap - recordGestureClassification( - TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__DOUBLE_TAP - ) - handled = handled or doubleTapListener.onDoubleTapEvent(ev) - } else if (mAlwaysInTapRegion) { - val deltaX = (focusX - mDownFocusX).toInt() - val deltaY = (focusY - mDownFocusY).toInt() - val distance = (deltaX * deltaX) + (deltaY * deltaY) - var slopSquare = if (isGeneratedGesture) 0 else mTouchSlopSquare - - val ambiguousGesture = - motionClassification == MotionEvent.CLASSIFICATION_AMBIGUOUS_GESTURE - val shouldInhibitDefaultAction = - hasPendingLongPress && ambiguousGesture - if (shouldInhibitDefaultAction) { - // Inhibit default long press - if (distance > slopSquare) { - // The default action here is to remove long press. But if the touch - // slop below gets increased, and we never exceed the modified touch - // slop while still receiving AMBIGUOUS_GESTURE, we risk that *nothing* - // will happen in response to user input. To prevent this, - // reschedule long press with a modified timeout. - mHandler!!.removeMessages(LONG_PRESS) - val longPressTimeout = - ViewConfiguration.getLongPressTimeout().toLong() - mHandler!!.sendMessageAtTime( - mHandler!!.obtainMessage( - LONG_PRESS, - TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__LONG_PRESS, - 0 */ -/* arg2 *//* - - ), - (ev.downTime - + (longPressTimeout * mAmbiguousGestureMultiplier).toLong()) - ) - } - // Inhibit default scroll. If a gesture is ambiguous, we prevent scroll - // until the gesture is resolved. - // However, for safety, simply increase the touch slop in case the - // classification is erroneous. Since the value is squared, multiply twice. - slopSquare = - (slopSquare * (mAmbiguousGestureMultiplier * mAmbiguousGestureMultiplier)).toInt() - } - - if (distance > slopSquare) { - recordGestureClassification( - TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__SCROLL - ) - handled = mListener!!.onScroll(mCurrentDownEvent, ev, scrollX, scrollY) - mLastFocusX = focusX - mLastFocusY = focusY - mAlwaysInTapRegion = false - mHandler!!.removeMessages(TAP) - mHandler!!.removeMessages(SHOW_PRESS) - mHandler!!.removeMessages(LONG_PRESS) - } - val doubleTapSlopSquare = - if (isGeneratedGesture) 0 else mDoubleTapTouchSlopSquare - if (distance > doubleTapSlopSquare) { - mAlwaysInBiggerTapRegion = false - } - } else if ((abs(scrollX.toDouble()) >= 1) || (abs(scrollY.toDouble()) >= 1)) { - recordGestureClassification(TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__SCROLL) - handled = mListener!!.onScroll(mCurrentDownEvent, ev, scrollX, scrollY) - mLastFocusX = focusX - mLastFocusY = focusY - } - val deepPress = - motionClassification == MotionEvent.CLASSIFICATION_DEEP_PRESS - if (deepPress && hasPendingLongPress) { - mHandler!!.removeMessages(LONG_PRESS) - mHandler!!.sendMessage( - mHandler!!.obtainMessage( - LONG_PRESS, - TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__DEEP_PRESS, - 0 */ -/* arg2 *//* - - ) - ) - } - } - - MotionEvent.ACTION_UP -> { - mStillDown = false - val currentUpEvent = MotionEvent.obtain(ev) - if (mIsDoubleTapping) { - // Finally, give the up event of the double-tap - recordGestureClassification( - TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__DOUBLE_TAP - ) - handled = handled or mDoubleTapListener!!.onDoubleTapEvent(ev) - } else if (mInLongPress) { - mHandler!!.removeMessages(android.view.GestureDetector.Companion.TAP) - mInLongPress = false - } else if (mAlwaysInTapRegion && !mIgnoreNextUpEvent) { - recordGestureClassification( - TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__SINGLE_TAP - ) - handled = mListener!!.onSingleTapUp(ev) - if (mDeferConfirmSingleTap && mDoubleTapListener != null) { - mDoubleTapListener!!.onSingleTapConfirmed(ev) - } - } else if (!mIgnoreNextUpEvent) { - // A fling must travel the minimum tap distance - - val velocityTracker = mVelocityTracker - val pointerId = ev.getPointerId(0) - velocityTracker!!.computeCurrentVelocity( - 1000, - mMaximumFlingVelocity.toFloat() - ) - val velocityY = velocityTracker.getYVelocity(pointerId) - val velocityX = velocityTracker.getXVelocity(pointerId) - - if (((abs(velocityY.toDouble()) > mMinimumFlingVelocity) - || (abs(velocityX.toDouble()) > mMinimumFlingVelocity)) - ) { - handled = - mListener!!.onFling(mCurrentDownEvent, ev, velocityX, velocityY) - } - } - if (mPreviousUpEvent != null) { - mPreviousUpEvent!!.recycle() - } - // Hold the event we obtained above - listeners may have changed the original. - mPreviousUpEvent = currentUpEvent - if (mVelocityTracker != null) { - // This may have been cleared when we called out to the - // application above. - mVelocityTracker!!.recycle() - mVelocityTracker = null - } - mIsDoubleTapping = false - mDeferConfirmSingleTap = false - mIgnoreNextUpEvent = false - mHandler!!.removeMessages(android.view.GestureDetector.Companion.SHOW_PRESS) - mHandler!!.removeMessages(android.view.GestureDetector.Companion.LONG_PRESS) - } - - MotionEvent.ACTION_CANCEL -> cancel() - } - if (!handled && mInputEventConsistencyVerifier != null) { - mInputEventConsistencyVerifier.onUnhandledEvent(ev, 0) - } - return handled - } - - fun onTouchStart() { - - } - - fun onTouchMove() { - - } - - fun onTouchEnd() { - - } - - */ -/** - * Analyzes the given generic motion event and if applicable triggers the - * appropriate callbacks on the [OnGestureListener] supplied. - * - * @param ev The current motion event. - * @return true if the [OnGestureListener] consumed the event, - * else false. - *//* - - fun onGenericMotionEvent(ev: MotionEvent): Boolean { - if (mInputEventConsistencyVerifier != null) { - mInputEventConsistencyVerifier.onGenericMotionEvent(ev, 0) - } - - val actionButton = ev.actionButton - when (ev.actionMasked) { - MotionEvent.ACTION_BUTTON_PRESS -> if (((mContextClickListener != null) && !mInContextClick && !mInLongPress - && ((actionButton == MotionEvent.BUTTON_STYLUS_PRIMARY - || actionButton == MotionEvent.BUTTON_SECONDARY))) - ) { - if (mContextClickListener!!.onContextClick(ev)) { - mInContextClick = true - mHandler!!.removeMessages(android.view.GestureDetector.Companion.LONG_PRESS) - mHandler!!.removeMessages(android.view.GestureDetector.Companion.TAP) - return true - } - } - - MotionEvent.ACTION_BUTTON_RELEASE -> if (mInContextClick && ((actionButton == MotionEvent.BUTTON_STYLUS_PRIMARY - || actionButton == MotionEvent.BUTTON_SECONDARY)) - ) { - mInContextClick = false - mIgnoreNextUpEvent = true - } - } - return false - } - - private fun cancel() { - mHandler!!.removeMessages(android.view.GestureDetector.Companion.SHOW_PRESS) - mHandler!!.removeMessages(android.view.GestureDetector.Companion.LONG_PRESS) - mHandler!!.removeMessages(android.view.GestureDetector.Companion.TAP) - mVelocityTracker!!.recycle() - mVelocityTracker = null - mIsDoubleTapping = false - mStillDown = false - mAlwaysInTapRegion = false - mAlwaysInBiggerTapRegion = false - mDeferConfirmSingleTap = false - mInLongPress = false - mInContextClick = false - mIgnoreNextUpEvent = false - } - - private fun cancelTaps() { - mHandler!!.removeMessages(android.view.GestureDetector.Companion.SHOW_PRESS) - mHandler!!.removeMessages(android.view.GestureDetector.Companion.LONG_PRESS) - mHandler!!.removeMessages(android.view.GestureDetector.Companion.TAP) - mIsDoubleTapping = false - mAlwaysInTapRegion = false - mAlwaysInBiggerTapRegion = false - mDeferConfirmSingleTap = false - mInLongPress = false - mInContextClick = false - mIgnoreNextUpEvent = false - } - - private fun isConsideredDoubleTap( - firstDown: MotionEvent, - firstUp: MotionEvent, secondDown: MotionEvent - ): Boolean { - if (!mAlwaysInBiggerTapRegion) { - return false - } - - val deltaTime = secondDown.eventTime - firstUp.eventTime - if (deltaTime > android.view.GestureDetector.Companion.DOUBLE_TAP_TIMEOUT || deltaTime < android.view.GestureDetector.Companion.DOUBLE_TAP_MIN_TIME) { - return false - } - - val deltaX = firstDown.x.toInt() - secondDown.x.toInt() - val deltaY = firstDown.y.toInt() - secondDown.y.toInt() - val isGeneratedGesture = - (firstDown.flags and MotionEvent.FLAG_IS_GENERATED_GESTURE) !== 0 - val slopSquare = if (isGeneratedGesture) 0 else mDoubleTapSlopSquare - return (deltaX * deltaX + deltaY * deltaY < slopSquare) - } - - private fun dispatchLongPress() { - mHandler!!.removeMessages(TAP) - mDeferConfirmSingleTap = false - mInLongPress = true - mListener!!.onLongPress((mCurrentDownEvent)!!) - } - - companion object { - private val TAG: String = android.view.GestureDetector::class.java.simpleName - private val TAP_TIMEOUT = ViewConfiguration.getTapTimeout() - private val DOUBLE_TAP_TIMEOUT = ViewConfiguration.getDoubleTapTimeout() - private val DOUBLE_TAP_MIN_TIME: Int = 40 // ViewConfiguration.getDoubleTapMinTime() - - // constants for Message.what used by GestureHandler below - private val SHOW_PRESS = 1 - private val LONG_PRESS = 2 - private val TAP = 3 - } - - @Suppress("Unused_parameter") - @android.webkit.JavascriptInterface - fun onDragStart(eventJson: String): Boolean { - Timber.d("onDragStart $eventJson") - val event = DragEvent.fromJSON(eventJson)?.takeIf { it.isValid } - ?: return false - - } - - @Suppress("Unused_parameter") - @android.webkit.JavascriptInterface - fun onDragMove(eventJson: String): Boolean { - Timber.d("onDragMove $eventJson") - */ -/*val event = DragEvent.fromJSON(eventJson)?.takeIf { it.isValid } - ?: return false *//* - - - return true - } - - - @Suppress("Unused_parameter") - @android.webkit.JavascriptInterface - fun onDragEnd(eventJson: String): Boolean { - Timber.d("onDragEnd $eventJson") - val event = DragEvent.fromJSON(eventJson)?.takeIf { it.isValid } - ?: return false - - - return true - - } -} - -*/ -/** Produced by gestures.js *//* - -private data class DragEvent( - val defaultPrevented: Boolean, - val startPoint: PointF, - val currentPoint: PointF, - val offset: PointF, - val interactiveElement: String? -) { - internal val isValid: Boolean get() = - !defaultPrevented && (interactiveElement == null) - - companion object { - - fun fromJSONObject(obj: JSONObject?): DragEvent? { - obj ?: return null - - return DragEvent( - defaultPrevented = obj.optBoolean("defaultPrevented"), - startPoint = PointF( - obj.optDouble("startX").toFloat(), - obj.optDouble("startY").toFloat() - ), - currentPoint = PointF( - obj.optDouble("currentX").toFloat(), - obj.optDouble("currentY").toFloat() - ), - offset = PointF( - obj.optDouble("offsetX").toFloat(), - obj.optDouble("offsetY").toFloat() - ), - interactiveElement = obj.optNullableString("interactiveElement") - ) - } - - fun fromJSON(json: String): DragEvent? = - fromJSONObject(tryOrNull { JSONObject(json) }) - } -} -*/ From c05315bfec9cb11428625981d0d94e51c962d723 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Fri, 26 Jul 2024 11:39:26 +0200 Subject: [PATCH 12/61] Disable gestures in pager. Every scroll action is performed in PagerNestedConnection. --- .../readium/navigator/web/NavigatorView.kt | 8 +--- .../web/util/PagerNestedConnection.kt | 38 +++++++++++++++++-- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt index b7323b29b8..fe31137b78 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt @@ -41,7 +41,7 @@ public fun NavigatorView( HorizontalPager( modifier = modifier, - userScrollEnabled = true, + userScrollEnabled = false, state = pagerState, beyondViewportPageCount = 2, flingBehavior = flingBehavior, @@ -55,6 +55,7 @@ public fun NavigatorView( is LayoutResolver.Spread.Single -> { val url = WebViewServer.publicationBaseHref.resolve(spread.url).toString() val webViewState = rememberWebViewState(url) + WebView( modifier = Modifier .fillMaxSize(), @@ -74,11 +75,6 @@ public fun NavigatorView( onDispose = { Timber.d("WebView onDispose $url") } - /*factory = { context -> - LoggingWebView(context).apply { - this.nestedScrollDispatcher = nestedScrollDispatcher - } - }*/ ) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt index 660f651c75..5f059ef8d5 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt @@ -1,5 +1,6 @@ package org.readium.navigator.web.util +import androidx.compose.foundation.MutatePriority import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.gestures.TargetedFlingBehavior import androidx.compose.foundation.pager.PagerState @@ -93,7 +94,38 @@ internal class PagerNestedConnection( return Velocity.Zero } var remaining: Float = available.x - state.scroll { + state.scroll(scrollPriority = MutatePriority.PreventUserInput) { + with(flingBehavior) { + remaining = -performFling(-available.x) + } + } + + if ((available.x - remaining).isNaN()) { + return available + } + + return Velocity(available.x - remaining, available.y) + } + + override fun onPostScroll( + consumed: Offset, + available: Offset, + source: NestedScrollSource + ): Offset { + val consumedX = -state.dispatchRawDelta(-available.x) + return Offset(consumedX, 0f) + } + + override suspend fun onPostFling( + consumed: Velocity, + available: Velocity + ): Velocity { + var remaining = available.x + if (state.isScrollInProgress) { + return available + } + + state.scroll(scrollPriority = MutatePriority.Default) { with(flingBehavior) { remaining = -performFling(-available.x) } @@ -117,8 +149,8 @@ internal class PagerNestedConnection( return Offset.Zero }*/ - override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { + /*override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { return Velocity.Zero // return available.consumeOnOrientation(orientation) - } + }*/ } From a5754f538b38a928cf0254fd72f48225f260a6a0 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Tue, 27 Aug 2024 15:10:08 +0200 Subject: [PATCH 13/61] Use JS to enable double spreads --- Makefile | 9 ++ .../readium/navigator/demo/DemoViewModel.kt | 18 +++- readium/navigators/web/scripts | 1 + .../web/prepaginated-double-index.html | 46 +++++++++ .../web/prepaginated-double-script.js | 1 + .../web/prepaginated-double-script.js.map | 1 + .../web/prepaginated-single-index.html | 37 +++++++ .../web/prepaginated-single-script.js | 1 + .../web/prepaginated-single-script.js.map | 1 + .../assets/readium/scripts/readium-fixed.js | 97 ------------------- .../readium/navigator/web/LayoutResolver.kt | 84 +++++++++++++--- .../readium/navigator/web/NavigatorFactory.kt | 26 ++++- .../readium/navigator/web/NavigatorState.kt | 9 +- .../readium/navigator/web/NavigatorView.kt | 82 ++++++++++------ .../org/readium/navigator/web/Position.kt | 5 + .../javascript/PrepaginatedDoubleLayout.kt | 20 ++++ .../javascript/PrepaginatedSingleLayout.kt | 19 ++++ .../web/preferences/NavigatorPreferences.kt | 6 +- .../web/preferences/NavigatorSettings.kt | 3 +- .../preferences/NavigatorSettingsResolver.kt | 3 +- .../navigator/web/util/HtmlInjector.kt | 4 +- .../navigator/web/webview/ComposeWebView.kt | 33 ++++++- 22 files changed, 349 insertions(+), 157 deletions(-) create mode 160000 readium/navigators/web/scripts create mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-index.html create mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js create mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map create mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-index.html create mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js create mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map delete mode 100644 readium/navigators/web/src/main/assets/readium/scripts/readium-fixed.js create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/Position.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/javascript/PrepaginatedDoubleLayout.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/javascript/PrepaginatedSingleLayout.kt diff --git a/Makefile b/Makefile index b03c46f2b2..354f36b39a 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ SCRIPTS_PATH := readium/navigator/src/main/assets/_scripts +SCRIPTS_NAVIGATOR_WEB_PATH := readium/navigators/web/scripts help: @echo "Usage: make \n\n\ @@ -25,3 +26,11 @@ scripts: pnpm run format; \ pnpm run lint; \ pnpm run bundle + + cd $(SCRIPTS_NAVIGATOR_WEB_PATH); \ + corepack install; \ + pnpm install --frozen-lockfile; \ + pnpm run format; \ + pnpm run lint; \ + pnpm run bundle; \ + cp -t ../src/main/assets/readium/navigators/web/ dist/* diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt index 99d9e7f779..abb57f5608 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt @@ -11,6 +11,9 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.readium.navigator.web.NavigatorFactory import org.readium.navigator.web.NavigatorState +import org.readium.navigator.web.preferences.NavigatorPreferences +import org.readium.r2.navigator.preferences.Fit +import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl import org.readium.r2.shared.util.DebugError @@ -88,10 +91,17 @@ class DemoViewModel( return@launch } - val navigatorState = navigatorFactory.createNavigator() - .getOrElse { - throw IllegalStateException() - } + val preferences = NavigatorPreferences( + fit = Fit.CONTAIN, + readingProgression = ReadingProgression.LTR, + spreads = false + ) + + val navigatorState = navigatorFactory.createNavigator( + initialPreferences = preferences + ).getOrElse { + throw IllegalStateException() + } stateMutable.value = State.Reader(navigatorState) } diff --git a/readium/navigators/web/scripts b/readium/navigators/web/scripts new file mode 160000 index 0000000000..a4b111c771 --- /dev/null +++ b/readium/navigators/web/scripts @@ -0,0 +1 @@ +Subproject commit a4b111c77172e27e7e4b3800d04a0307d41051b8 diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-index.html b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-index.html new file mode 100644 index 0000000000..b6c044dbd9 --- /dev/null +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-index.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + +
+ + + +
+ + + + diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js new file mode 100644 index 0000000000..8fc16a46be --- /dev/null +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js @@ -0,0 +1 @@ +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){var t,e,s,h,n,a,o,r;if(!this.viewport||!this.leftPage.size&&!this.rightPage.size)return;const l={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(l);const g={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(g);const d=(null!==(e=null===(t=this.leftPage.size)||void 0===t?void 0:t.width)&&void 0!==e?e:0)+(null!==(h=null===(s=this.rightPage.size)||void 0===s?void 0:s.width)&&void 0!==h?h:0),m=Math.max(null!==(a=null===(n=this.leftPage.size)||void 0===n?void 0:n.height)&&void 0!==a?a:0,null!==(r=null===(o=this.rightPage.size)||void 0===o?void 0:o.height)&&void 0!==r?r:0),c={width:d,height:m},u=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,c,this.viewport);this.metaViewport.content=(new i).setInitialScale(u).setMinimumScale(u).setWidth(d).setHeight(m).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),n=new e(i,s,h);t.loadSpread=function(t){n.loadSpread(t)},t.setViewport=function(t,i,e,s,h,a){const o={width:t,height:i},r={top:e,left:s,bottom:h,right:a};n.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);n.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map new file mode 100644 index 0000000000..94422766f9 --- /dev/null +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map @@ -0,0 +1 @@ +{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/prepaginated/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/prepaginated/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (viewport instanceof HTMLMetaElement) {\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"./fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"./viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n if (!this.viewport || (!this.leftPage.size && !this.rightPage.size)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n const contentWidth = ((_b = (_a = this.leftPage.size) === null || _a === void 0 ? void 0 : _a.width) !== null && _b !== void 0 ? _b : 0) + ((_d = (_c = this.rightPage.size) === null || _c === void 0 ? void 0 : _c.width) !== null && _d !== void 0 ? _d : 0);\n const contentHeight = Math.max((_f = (_e = this.leftPage.size) === null || _e === void 0 ? void 0 : _e.height) !== null && _f !== void 0 ? _f : 0, (_h = (_g = this.rightPage.size) === null || _g === void 0 ? void 0 : _g.height) !== null && _h !== void 0 ? _h : 0);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n let viewport = { width: viewporttWidth, height: viewportHeight };\n let insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","width","height","size","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","_a","_b","_c","_d","_e","_f","_g","_h","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-index.html b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-index.html new file mode 100644 index 0000000000..d72e5eb9a2 --- /dev/null +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-index.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + + +
+ +
+ + + diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js new file mode 100644 index 0000000000..529ff205f9 --- /dev/null +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js @@ -0,0 +1 @@ +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map new file mode 100644 index 0000000000..768e26abb0 --- /dev/null +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map @@ -0,0 +1 @@ +{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/prepaginated/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/prepaginated/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (viewport instanceof HTMLMetaElement) {\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"./fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"./viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.page.size = this.page.size;\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n let viewport = { width: viewporttWidth, height: viewportHeight };\n let insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","width","height","size","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/scripts/readium-fixed.js b/readium/navigators/web/src/main/assets/readium/scripts/readium-fixed.js deleted file mode 100644 index 38b51a0ea2..0000000000 --- a/readium/navigators/web/src/main/assets/readium/scripts/readium-fixed.js +++ /dev/null @@ -1,97 +0,0 @@ -window.addEventListener("DOMContentLoaded", function () { - bindDragGesture(document); -}); - -// See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling -function nearestInteractiveElement(element) { - if (element == null) { - return null; - } - var interactiveTags = [ - "a", - "audio", - "button", - "canvas", - "details", - "input", - "label", - "option", - "select", - "submit", - "textarea", - "video", - ]; - if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) { - return element.outerHTML; - } -} - -function bindDragGesture(element) { - // passive: false is necessary to be able to prevent the default behavior. - element.addEventListener("touchstart", onStart, { passive: false }); - element.addEventListener("touchend", onEnd, { passive: false }); - element.addEventListener("touchmove", onMove, { passive: false }); - - var state = undefined; - var isStartingDrag = false; - const pixelRatio = window.devicePixelRatio; - - function onStart(event) { - if (state) { - state = undefined; - isStartingDrag = false; - return; - } - - isStartingDrag = true; - - const startX = event.touches[0].clientX * pixelRatio; - const startY = event.touches[0].clientY * pixelRatio; - state = { - defaultPrevented: event.defaultPrevented, - startX: startX, - startY: startY, - currentX: startX, - currentY: startY, - offsetX: 0, - offsetY: 0, - interactiveElement: nearestInteractiveElement(event.target), - }; - } - - function onMove(event) { - if (!state) return; - - state.currentX = event.touches[0].clientX * pixelRatio; - state.currentY = event.touches[0].clientY * pixelRatio; - state.offsetX = state.currentX - state.startX; - state.offsetY = state.currentY - state.startY; - - var shouldPreventDefault = false; - // Wait for a movement of at least 6 pixels before reporting a drag. - if (isStartingDrag) { - if (Math.abs(state.offsetX) >= 6 || Math.abs(state.offsetY) >= 6) { - isStartingDrag = false; - shouldPreventDefault = Gestures.onDragStart(JSON.stringify(state)); - } - } else { - shouldPreventDefault = Gestures.onDragMove(JSON.stringify(state)); - } - - if (shouldPreventDefault) { - event.stopPropagation(); - event.preventDefault(); - } - } - - function onEnd(event) { - if (!state) return; - - const shouldPreventDefault = Gestures.onDragEnd(JSON.stringify(state)); - if (shouldPreventDefault) { - event.stopPropagation(); - event.preventDefault(); - } - state = undefined; - } -} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/LayoutResolver.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/LayoutResolver.kt index 4f5fa4da7f..d47c577093 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/LayoutResolver.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/LayoutResolver.kt @@ -1,6 +1,7 @@ package org.readium.navigator.web import org.readium.navigator.web.preferences.NavigatorSettings +import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.Url @@ -8,31 +9,86 @@ import org.readium.r2.shared.util.Url internal class LayoutResolver( private val readingOrder: List ) { - - enum class Position { - Left, - Right, - Center - } - data class Page( - val url: Url + val url: Url, + val position: Position? ) sealed class Spread { data class Single( - val url: Url, - val position: Position? = null + val value: Url ) : Spread() data class Double( - val first: Url, - val second: Url + val left: Url?, + val right: Url? ) : Spread() } - @Suppress("Unused_parameter") fun layout(settings: NavigatorSettings): List = - readingOrder.map { Spread.Single(it.url) } + if (settings.spreads) { + when (settings.readingProgression) { + ReadingProgression.LTR -> layoutSpreadsLtr() + ReadingProgression.RTL -> layoutSpreadsRtl() + } + } else { + readingOrder.map { Spread.Single(it.url) } + } + + private fun layoutSpreadsLtr(): List = + buildList { + var pending: Page? = null + + for (page in readingOrder) { + when (page.position) { + Position.Left -> { + pending?.let { add(Spread.Double(it.url, null)) } + pending = page + } + Position.Right -> { + add(Spread.Double(pending?.url, page.url)) + pending = null + } + null -> { + if (pending == null) { + pending = page + } else { + add(Spread.Double(pending.url, page.url)) + pending = null + } + } + } + } + + pending?.let { add(Spread.Double(it.url, null)) } + } + + private fun layoutSpreadsRtl(): List = + buildList { + var pending: Page? = null + + for (page in readingOrder) { + when (page.position) { + Position.Left -> { + add(Spread.Double(page.url, pending?.url)) + pending = null + } + Position.Right -> { + pending?.let { add(Spread.Double(null, it.url)) } + pending = page + } + null -> { + if (pending == null) { + pending = page + } else { + add(Spread.Double(page.url, pending.url)) + pending = null + } + } + } + } + + pending?.let { add(Spread.Double(null, it.url)) } + } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt index 460e96a103..f51b582a7f 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt @@ -18,6 +18,8 @@ import org.readium.r2.shared.publication.Link import org.readium.r2.shared.publication.Locator import org.readium.r2.shared.publication.Publication import org.readium.r2.shared.publication.indexOfFirstWithHref +import org.readium.r2.shared.publication.presentation.Presentation +import org.readium.r2.shared.publication.presentation.page import org.readium.r2.shared.util.Try @ExperimentalReadiumApi @@ -63,7 +65,13 @@ public class NavigatorFactory private constructor( ): Try { val items = readingOrder.map { NavigatorState.ReadingOrder.Item( - href = it.url() + href = it.url(), + position = when (it.properties.page) { + Presentation.Page.LEFT -> Position.Left + Presentation.Page.RIGHT -> Position.Right + Presentation.Page.CENTER -> null + null -> null + } ) } @@ -81,6 +89,18 @@ public class NavigatorFactory private constructor( onResourceLoadFailed = { _, _ -> } ) + val fxlSpreadOne = application.assets + .open("readium/navigators/web/prepaginated-single-index.html") + .bufferedReader() + .use { it.readText() } + .replace("{{ASSETS_URL}}", WebViewServer.assetUrl("readium/navigators/web").toString()) + + val fxlSpreadTwo = application.assets + .open("readium/navigators/web/prepaginated-double-index.html") + .bufferedReader() + .use { it.readText() } + .replace("{{ASSETS_URL}}", WebViewServer.assetUrl("readium/navigators/web").toString()) + val navigatorState = NavigatorState( publicationMetadata = publication.metadata, @@ -88,7 +108,9 @@ public class NavigatorFactory private constructor( initialPreferences = initialPreferences ?: NavigatorPreferences(), defaults = defaults, initialItem = initialIndex, - webViewServer = webViewServer + webViewServer = webViewServer, + fxlSpreadOne = fxlSpreadOne, + fxlSpreadTwo = fxlSpreadTwo ) return Try.success(navigatorState) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt index 90bf113257..eae03496da 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt @@ -24,14 +24,17 @@ public class NavigatorState internal constructor( initialPreferences: NavigatorPreferences, defaults: NavigatorDefaults, initialItem: Int, - internal val webViewServer: WebViewServer + internal val webViewServer: WebViewServer, + internal val fxlSpreadOne: String, + internal val fxlSpreadTwo: String ) { public data class ReadingOrder( val items: List ) { public data class Item( - val href: Url + val href: Url, + val position: Position? ) } @@ -43,7 +46,7 @@ public class NavigatorState internal constructor( NavigatorSettingsResolver(publicationMetadata, defaults) private val layoutResolver = - LayoutResolver(readingOrder.items.map { LayoutResolver.Page(it.href) }) + LayoutResolver(readingOrder.items.map { LayoutResolver.Page(it.href, it.position) }) private val preferences: MutableState = mutableStateOf(initialPreferences) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt index fe31137b78..827806b323 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt @@ -3,6 +3,7 @@ package org.readium.navigator.web import android.annotation.SuppressLint import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.PagerDefaults @@ -10,13 +11,16 @@ import androidx.compose.foundation.pager.PagerSnapDistance import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Size import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import org.readium.navigator.web.javascript.PrepaginatedDoubleLayout +import org.readium.navigator.web.javascript.PrepaginatedSingleLayout import org.readium.navigator.web.util.LoggingNestedScrollConnection import org.readium.navigator.web.util.LoggingTargetedFlingBehavior import org.readium.navigator.web.util.PagerNestedConnection import org.readium.navigator.web.util.WebViewServer import org.readium.navigator.web.webview.WebView -import org.readium.navigator.web.webview.rememberWebViewState +import org.readium.navigator.web.webview.rememberWebViewStateWithHTMLData import org.readium.r2.shared.ExperimentalReadiumApi import timber.log.Timber @@ -49,34 +53,58 @@ public fun NavigatorView( PagerNestedConnection(pagerState, flingBehavior, Orientation.Horizontal) ) ) { - when (val spread = state.spreads.value[it]) { - is LayoutResolver.Spread.Double -> - throw NotImplementedError() - is LayoutResolver.Spread.Single -> { - val url = WebViewServer.publicationBaseHref.resolve(spread.url).toString() - val webViewState = rememberWebViewState(url) + BoxWithConstraints( + modifier = Modifier.fillMaxSize(), + propagateMinConstraints = true + ) { + val size = Size(maxWidth.value, maxHeight.value) + Timber.d("size $size") - WebView( - modifier = Modifier - .fillMaxSize(), - state = webViewState, - client = state.webViewClient, - onCreated = { webview -> - Timber.d("WebView onCreate $url") - webview.settings.javaScriptEnabled = true - webview.settings.setSupportZoom(true) - webview.settings.builtInZoomControls = true - webview.settings.displayZoomControls = false - webview.settings.loadWithOverviewMode = true - webview.settings.useWideViewPort = true - webview.isVerticalScrollBarEnabled = false - webview.isHorizontalScrollBarEnabled = false - }, - onDispose = { - Timber.d("WebView onDispose $url") - } - ) + val webViewState = when (val spread = state.spreads.value[it]) { + is LayoutResolver.Spread.Double -> + rememberWebViewStateWithHTMLData( + data = state.fxlSpreadTwo, + baseUrl = WebViewServer.publicationBaseHref.toString(), + onLoaded = { + with(PrepaginatedDoubleLayout()) { + loadSpread(spread) + setViewport(size.width, size.height) + } + } + ) + + is LayoutResolver.Spread.Single -> { + rememberWebViewStateWithHTMLData( + data = state.fxlSpreadOne, + baseUrl = WebViewServer.publicationBaseHref.toString(), + onLoaded = { + with(PrepaginatedSingleLayout()) { + loadSpread(spread) + setViewport(size.width, size.height) + } + } + ) + } } + + WebView( + modifier = Modifier + .fillMaxSize(), + state = webViewState, + client = state.webViewClient, + onCreated = { webview -> + webview.settings.javaScriptEnabled = true + webview.settings.setSupportZoom(true) + webview.settings.builtInZoomControls = true + webview.settings.displayZoomControls = false + webview.settings.loadWithOverviewMode = true + webview.settings.useWideViewPort = true + webview.isVerticalScrollBarEnabled = false + webview.isHorizontalScrollBarEnabled = false + }, + onDispose = { + } + ) } } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/Position.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/Position.kt new file mode 100644 index 0000000000..0de5a6c8a3 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/Position.kt @@ -0,0 +1,5 @@ +package org.readium.navigator.web + +public enum class Position { + Left, Right; +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/javascript/PrepaginatedDoubleLayout.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/javascript/PrepaginatedDoubleLayout.kt new file mode 100644 index 0000000000..5cdd1ff200 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/javascript/PrepaginatedDoubleLayout.kt @@ -0,0 +1,20 @@ +package org.readium.navigator.web.javascript + +import android.webkit.WebView +import org.readium.navigator.web.LayoutResolver +import org.readium.navigator.web.util.WebViewServer +import org.readium.r2.shared.ExperimentalReadiumApi + +@OptIn(ExperimentalReadiumApi::class) +internal class PrepaginatedDoubleLayout { + + fun WebView.loadSpread(spread: LayoutResolver.Spread.Double) { + val leftUrl = spread.left?.let { WebViewServer.publicationBaseHref.resolve(it) } + val rightUrl = spread.right?.let { WebViewServer.publicationBaseHref.resolve(it) } + evaluateJavascript("layout.loadSpread({ left: `$leftUrl`, right: `$rightUrl`});") {} + } + + fun WebView.setViewport(width: Float, height: Float) { + evaluateJavascript("layout.setViewport($width, $height, 0, 0, 0, 0);") {} + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/javascript/PrepaginatedSingleLayout.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/javascript/PrepaginatedSingleLayout.kt new file mode 100644 index 0000000000..ac2cc2caf7 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/javascript/PrepaginatedSingleLayout.kt @@ -0,0 +1,19 @@ +package org.readium.navigator.web.javascript + +import android.webkit.WebView +import org.readium.navigator.web.LayoutResolver +import org.readium.navigator.web.util.WebViewServer +import org.readium.r2.shared.ExperimentalReadiumApi + +@OptIn(ExperimentalReadiumApi::class) +internal class PrepaginatedSingleLayout { + + fun WebView.loadSpread(spread: LayoutResolver.Spread.Single) { + val resourceUrl = WebViewServer.publicationBaseHref.resolve(spread.value) + evaluateJavascript("layout.loadResource(`$resourceUrl`);") {} + } + + fun WebView.setViewport(width: Float, height: Float) { + evaluateJavascript("layout.setViewport($width, $height, 0, 0, 0, 0);") {} + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferences.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferences.kt index b8707de68b..adabd558a8 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferences.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferences.kt @@ -10,12 +10,14 @@ import org.readium.r2.shared.ExperimentalReadiumApi @ExperimentalReadiumApi public data class NavigatorPreferences( val fit: Fit? = null, - val readingProgression: ReadingProgression? = null + val readingProgression: ReadingProgression? = null, + val spreads: Boolean? = null ) : Configurable.Preferences { override operator fun plus(other: NavigatorPreferences): NavigatorPreferences = NavigatorPreferences( fit = other.fit ?: fit, - readingProgression = other.readingProgression ?: readingProgression + readingProgression = other.readingProgression ?: readingProgression, + spreads = other.spreads ?: spreads ) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettings.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettings.kt index 81d4b43f34..40c0b80e58 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettings.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettings.kt @@ -8,5 +8,6 @@ import org.readium.r2.shared.ExperimentalReadiumApi @ExperimentalReadiumApi public data class NavigatorSettings( val fit: Fit, - val readingProgression: ReadingProgression + val readingProgression: ReadingProgression, + val spreads: Boolean ) : Configurable.Settings diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettingsResolver.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettingsResolver.kt index 2e54774e42..b2a444f056 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettingsResolver.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettingsResolver.kt @@ -27,7 +27,8 @@ internal class NavigatorSettingsResolver( return NavigatorSettings( fit = fit, - readingProgression = readingProgression + readingProgression = readingProgression, + spreads = preferences.spreads ?: false ) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/HtmlInjector.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/HtmlInjector.kt index db3ec1f5db..84e253d717 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/HtmlInjector.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/HtmlInjector.kt @@ -37,9 +37,9 @@ internal fun Resource.injectHtml( var content = bytes.toString(mediaType.charset ?: Charsets.UTF_8).trim() val injectables = mutableListOf() - injectables.add( + /*injectables.add( script(baseHref.resolve(Url("readium/scripts/readium-fixed.js")!!)) - ) + )*/ // Disable the text selection if the publication is protected. // FIXME: This is a hack until proper LCP copy is implemented, see https://github.com/readium/kotlin-toolkit/issues/221 diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposeWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposeWebView.kt index 666a3e8322..98cf343e38 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposeWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposeWebView.kt @@ -51,6 +51,9 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.viewinterop.AndroidView import androidx.core.view.ViewCompat +import androidx.core.view.postDelayed +import androidx.webkit.WebViewCompat +import androidx.webkit.WebViewFeature import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow @@ -221,6 +224,7 @@ internal fun WebView( content.encoding, content.historyUrl ) + wv.onContentReady { content.onLoaded(wv) } } is WebContent.Post -> { @@ -362,7 +366,8 @@ internal sealed class WebContent { val baseUrl: String? = null, val encoding: String = "utf-8", val mimeType: String? = null, - val historyUrl: String? = null + val historyUrl: String? = null, + val onLoaded: WebView.() -> Unit ) : WebContent() internal data class Post( @@ -706,17 +711,19 @@ internal fun rememberWebViewStateWithHTMLData( baseUrl: String? = null, encoding: String = "utf-8", mimeType: String? = null, - historyUrl: String? = null + historyUrl: String? = null, + onLoaded: WebView.() -> Unit ): WebViewState = remember { - WebViewState(WebContent.Data(data, baseUrl, encoding, mimeType, historyUrl)) + WebViewState(WebContent.Data(data, baseUrl, encoding, mimeType, historyUrl, onLoaded)) }.apply { this.content = WebContent.Data( data, baseUrl, encoding, mimeType, - historyUrl + historyUrl, + onLoaded ) } @@ -782,3 +789,21 @@ internal val WebStateSaver: Saver = run { } ) } + +/** + * Will run the given [action] when the content of the [WebView] is fully laid out. + */ +private fun WebView.onContentReady(action: () -> Unit) { + if (WebViewFeature.isFeatureSupported(WebViewFeature.VISUAL_STATE_CALLBACK)) { + WebViewCompat.postVisualStateCallback(this, 0) { + action() + } + } else { + // On older devices, there's no reliable way to guarantee the page is fully laid out. + // As a workaround, we run a dummy JavaScript, then wait for a short delay before + // assuming it's ready. + evaluateJavascript("true") { + postDelayed(500, action) + } + } +} From f60895336c8bec3e3276ac7d8820a5ae6c3e46bd Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 28 Aug 2024 10:37:18 +0200 Subject: [PATCH 14/61] Clean up and add preferences sheet --- .../readium/navigator/demo/DemoActivity.kt | 63 ++++++- .../readium/navigator/demo/DemoViewModel.kt | 36 ++-- .../demo/preferences/PreferenceViews.kt | 169 ++++++++++++++++++ .../demo/preferences/PreferencesManager.kt | 32 ++++ .../demo/preferences/UserPreferences.kt | 146 +++++++++++++++ .../preferences/UserPreferencesViewModel.kt | 34 ++++ .../navigator/demo/util/EmphasisProvider.kt | 47 +++++ .../org/readium/navigator/demo/util/Group.kt | 23 +++ .../navigator/demo/util/ToggleButton.kt | 94 ++++++++++ .../readium/navigator/web/NavigatorState.kt | 2 +- .../readium/navigator/web/NavigatorView.kt | 15 +- .../web/gestures/AndroidScrollable.android.kt | 16 ++ .../LoggingNestedScrollConnection.kt | 2 +- .../LoggingTargetedFlingBehavior.kt | 2 +- .../web/preferences/NavigatorDefaults.kt | 5 +- .../web/preferences/NavigatorPreferences.kt | 4 + .../preferences/NavigatorPreferencesEditor.kt | 18 +- .../preferences/NavigatorSettingsResolver.kt | 7 +- .../web/util/PagerNestedConnection.kt | 56 ------ .../web/util/PointerDirectionConfig.kt | 49 ----- .../web/util/WebViewDraggableState.kt | 74 -------- .../web/util/WebViewScrollable2DState.kt | 13 -- .../web/util/WebViewScrollableState.kt | 68 ------- .../navigator/web/util/WebViewScroller.kt | 81 --------- .../PrepaginatedDoubleLayout.kt | 2 +- .../PrepaginatedSingleLayout.kt | 2 +- .../navigator/web/webview/LoggingWebView.kt | 149 --------------- 27 files changed, 685 insertions(+), 524 deletions(-) create mode 100644 readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/PreferenceViews.kt create mode 100644 readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/PreferencesManager.kt create mode 100644 readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferences.kt create mode 100644 readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferencesViewModel.kt create mode 100644 readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/EmphasisProvider.kt create mode 100644 readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Group.kt create mode 100644 readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/ToggleButton.kt rename readium/navigators/web/src/main/java/org/readium/navigator/web/{util => logging}/LoggingNestedScrollConnection.kt (97%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/{util => logging}/LoggingTargetedFlingBehavior.kt (93%) delete mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/PointerDirectionConfig.kt delete mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewDraggableState.kt delete mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollableState.kt delete mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScroller.kt rename readium/navigators/web/src/main/java/org/readium/navigator/web/{javascript => webapi}/PrepaginatedDoubleLayout.kt (94%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/{javascript => webapi}/PrepaginatedSingleLayout.kt (93%) delete mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/webview/LoggingWebView.kt diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt index d06d82bf2d..2b309251a9 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt @@ -1,3 +1,9 @@ +/* + * Copyright 2024 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + package org.readium.navigator.demo import android.net.Uri @@ -9,19 +15,32 @@ import androidx.activity.viewModels import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Settings +import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.rememberModalBottomSheetState +import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import org.readium.navigator.demo.preferences.UserPreferences import org.readium.navigator.web.NavigatorView import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.toAbsoluteUrl -@OptIn(ExperimentalReadiumApi::class) +@OptIn(ExperimentalReadiumApi::class, ExperimentalMaterial3Api::class) class DemoActivity : ComponentActivity() { private val viewModel: DemoViewModel by viewModels() @@ -40,9 +59,18 @@ class DemoActivity : ComponentActivity() { setContent { MaterialTheme { val snackbarHostState = remember { SnackbarHostState() } + val preferencesSheetState = rememberModalBottomSheetState() + var showPreferences by remember { mutableStateOf(false) } Scaffold( modifier = Modifier.fillMaxSize(), + topBar = { + TopBar( + onPreferencesActivated = { + showPreferences = !showPreferences + } + ) + }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) } ) { paddingValues -> @@ -68,9 +96,21 @@ class DemoActivity : ComponentActivity() { // Display nothing } is DemoViewModel.State.Reader -> { + if (showPreferences) { + ModalBottomSheet( + sheetState = preferencesSheetState, + onDismissRequest = { showPreferences = false } + ) { + UserPreferences( + model = stateNow.preferencesViewModel, + title = "Preferences" + ) + } + } + NavigatorView( modifier = Modifier.fillMaxSize(), - state = stateNow.state + state = stateNow.navigatorState ) } } @@ -79,4 +119,23 @@ class DemoActivity : ComponentActivity() { } } } + + @Composable + private fun TopBar( + onPreferencesActivated: () -> Unit + ) { + CenterAlignedTopAppBar( + title = {}, + actions = { + IconButton( + onClick = onPreferencesActivated + ) { + Icon( + imageVector = Icons.Filled.Settings, + contentDescription = "Preferences" + ) + } + } + ) + } } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt index abb57f5608..a2331017f3 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt @@ -1,3 +1,9 @@ +/* + * Copyright 2024 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + @file:OptIn(ExperimentalReadiumApi::class) package org.readium.navigator.demo @@ -8,12 +14,14 @@ import androidx.lifecycle.viewModelScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch +import org.readium.navigator.demo.preferences.PreferencesManager +import org.readium.navigator.demo.preferences.UserPreferencesViewModel import org.readium.navigator.web.NavigatorFactory import org.readium.navigator.web.NavigatorState import org.readium.navigator.web.preferences.NavigatorPreferences -import org.readium.r2.navigator.preferences.Fit -import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl import org.readium.r2.shared.util.DebugError @@ -41,7 +49,8 @@ class DemoViewModel( ) : State data class Reader( - val state: NavigatorState + val navigatorState: NavigatorState, + val preferencesViewModel: UserPreferencesViewModel ) : State } @@ -91,19 +100,26 @@ class DemoViewModel( return@launch } - val preferences = NavigatorPreferences( - fit = Fit.CONTAIN, - readingProgression = ReadingProgression.LTR, - spreads = false - ) + val initialPreferences = NavigatorPreferences() + + val preferencesViewModel = + UserPreferencesViewModel( + viewModelScope = viewModelScope, + preferencesManager = PreferencesManager(initialPreferences), + createPreferencesEditor = navigatorFactory::createPreferencesEditor + ) val navigatorState = navigatorFactory.createNavigator( - initialPreferences = preferences + initialPreferences = initialPreferences ).getOrElse { throw IllegalStateException() } - stateMutable.value = State.Reader(navigatorState) + preferencesViewModel.preferences + .onEach { navigatorState.preferences.value = it } + .launchIn(viewModelScope) + + stateMutable.value = State.Reader(navigatorState, preferencesViewModel) } } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/PreferenceViews.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/PreferenceViews.kt new file mode 100644 index 0000000000..48e40b9d28 --- /dev/null +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/PreferenceViews.kt @@ -0,0 +1,169 @@ +/* + * Copyright 2024 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +@file:OptIn(ExperimentalReadiumApi::class) + +package org.readium.navigator.demo.preferences + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Row +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.Backspace +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.ListItem +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import org.readium.navigator.demo.util.Group +import org.readium.navigator.demo.util.ToggleButtonGroup +import org.readium.r2.navigator.preferences.EnumPreference +import org.readium.r2.navigator.preferences.Preference +import org.readium.r2.navigator.preferences.clear +import org.readium.r2.navigator.preferences.toggle +import org.readium.r2.shared.ExperimentalReadiumApi + +/** + * Component for an [EnumPreference] displayed as a group of mutually exclusive buttons. + * This works best with a small number of enum values. + */ +@Composable +fun ButtonGroupItem( + title: String, + preference: EnumPreference, + commit: () -> Unit, + formatValue: (T) -> String +) { + ButtonGroupItem( + title = title, + options = preference.supportedValues, + isActive = preference.isEffective, + activeOption = preference.effectiveValue, + selectedOption = preference.value, + formatValue = formatValue, + onClear = { preference.clear(); commit() } + .takeIf { preference.value != null }, + onSelectedOptionChanged = { newValue -> + if (newValue == preference.value) { + preference.clear() + } else { + preference.set(newValue) + } + commit() + } + ) +} + +/** + * Group of mutually exclusive buttons. + */ +@Composable +private fun ButtonGroupItem( + title: String, + options: List, + isActive: Boolean, + activeOption: T, + selectedOption: T?, + formatValue: (T) -> String, + onClear: (() -> Unit)?, + onSelectedOptionChanged: (T) -> Unit +) { + Item(title, isActive = isActive, onClear = onClear) { + ToggleButtonGroup( + options = options, + activeOption = activeOption, + selectedOption = selectedOption, + onSelectOption = { option -> onSelectedOptionChanged(option) } + ) { option -> + Text( + text = formatValue(option), + style = MaterialTheme.typography.labelSmall + ) + } + } +} + +/** + * Component for a boolean [Preference]. + */ +@Composable +fun SwitchItem( + title: String, + preference: Preference, + commit: () -> Unit +) { + SwitchItem( + title = title, + value = preference.value ?: preference.effectiveValue, + isActive = preference.isEffective, + onCheckedChange = { preference.set(it); commit() }, + onToggle = { preference.toggle(); commit() }, + onClear = { preference.clear(); commit() } + .takeIf { preference.value != null } + ) +} + +/** + * Switch + */ +@Composable +private fun SwitchItem( + title: String, + value: Boolean, + isActive: Boolean, + onCheckedChange: (Boolean) -> Unit, + onToggle: () -> Unit, + onClear: (() -> Unit)? +) { + Item( + title = title, + isActive = isActive, + onClick = onToggle, + onClear = onClear + ) { + Switch( + checked = value, + onCheckedChange = onCheckedChange + ) + } +} + +@Composable +private fun Item( + title: String, + isActive: Boolean = true, + onClick: (() -> Unit)? = null, + onClear: (() -> Unit)? = null, + content: @Composable () -> Unit +) { + ListItem( + modifier = + if (onClick != null) { + Modifier.clickable(onClick = onClick) + } else { + Modifier + }, + headlineContent = { + Group(enabled = isActive) { + Text(title) + } + }, + trailingContent = { + Row { + content() + + IconButton(onClick = onClear ?: {}, enabled = onClear != null) { + Icon( + Icons.AutoMirrored.Filled.Backspace, + contentDescription = "Clear" + ) + } + } + } + ) +} diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/PreferencesManager.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/PreferencesManager.kt new file mode 100644 index 0000000000..68b764c39c --- /dev/null +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/PreferencesManager.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2024 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +@file:OptIn(ExperimentalReadiumApi::class) + +package org.readium.navigator.demo.preferences + +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import org.readium.r2.navigator.preferences.Configurable +import org.readium.r2.shared.ExperimentalReadiumApi + +/** + * Trivial user preferences manager without persistence. + */ +class PreferencesManager

>( + initialPreferences: P +) { + private val preferencesMutable: MutableStateFlow

= + MutableStateFlow(initialPreferences) + + val preferences: StateFlow

= + preferencesMutable.asStateFlow() + + fun setPreferences(preferences: P) { + preferencesMutable.value = preferences + } +} diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferences.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferences.kt new file mode 100644 index 0000000000..7c931d6d3d --- /dev/null +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferences.kt @@ -0,0 +1,146 @@ +/* + * Copyright 2024 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +@file:OptIn(ExperimentalReadiumApi::class) + +package org.readium.navigator.demo.preferences + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Button +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import org.readium.navigator.web.preferences.NavigatorPreferencesEditor +import org.readium.r2.navigator.preferences.Configurable +import org.readium.r2.navigator.preferences.EnumPreference +import org.readium.r2.navigator.preferences.Fit +import org.readium.r2.navigator.preferences.Preference +import org.readium.r2.navigator.preferences.PreferencesEditor +import org.readium.r2.navigator.preferences.ReadingProgression +import org.readium.r2.shared.ExperimentalReadiumApi + +/** + * Stateful user settings component. + */ +@Composable +fun UserPreferences( + model: UserPreferencesViewModel<*>, + title: String +) { + val editor by model.editor.collectAsState() + + UserPreferences( + editor = editor, + commit = model::commit, + title = title + ) +} + +@Composable +private fun

, E : PreferencesEditor

> UserPreferences( + editor: E, + commit: () -> Unit, + title: String +) { + val scrollState = rememberScrollState() + + Column( + modifier = Modifier + .verticalScroll(scrollState) + .padding(vertical = 24.dp) + ) { + Text( + text = title, + textAlign = TextAlign.Center, + style = MaterialTheme.typography.headlineSmall, + color = MaterialTheme.colorScheme.onSurface, + modifier = Modifier + .fillMaxWidth() + ) + + Row( + modifier = Modifier + .padding(16.dp) + .align(Alignment.End), + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + Button( + onClick = { editor.clear(); commit() } + ) { + Text("Reset") + } + } + + Divider() + + when (editor) { + is NavigatorPreferencesEditor -> + FixedLayoutUserPreferences( + commit = commit, + readingProgression = editor.readingProgression, + fit = editor.fit, + spreads = editor.spreads + ) + } + } +} + +/** + * User preferences for a publication with a fixed layout, such as fixed-layout EPUB, PDF or comic book. + */ +@Composable +private fun FixedLayoutUserPreferences( + commit: () -> Unit, + readingProgression: EnumPreference, + fit: EnumPreference, + spreads: Preference +) { + ButtonGroupItem( + title = "Reading progression", + preference = readingProgression, + commit = commit, + formatValue = { it.name } + ) + + Divider() + + SwitchItem( + title = "Spreads", + preference = spreads, + commit = commit + ) + + ButtonGroupItem( + title = "Fit", + preference = fit, + commit = commit + ) { value -> + when (value) { + Fit.CONTAIN -> "Contain" + Fit.COVER -> "Cover" + Fit.WIDTH -> "Width" + Fit.HEIGHT -> "Height" + } + } +} + +@Composable +private fun Divider() { + HorizontalDivider(modifier = Modifier.padding(vertical = 16.dp)) +} diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferencesViewModel.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferencesViewModel.kt new file mode 100644 index 0000000000..d14cc26c9f --- /dev/null +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferencesViewModel.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2024 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +package org.readium.navigator.demo.preferences + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch +import org.readium.r2.navigator.preferences.Configurable +import org.readium.r2.navigator.preferences.PreferencesEditor +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.InternalReadiumApi +import org.readium.r2.shared.extensions.mapStateIn + +@OptIn(ExperimentalReadiumApi::class, InternalReadiumApi::class) +class UserPreferencesViewModel

>( + private val viewModelScope: CoroutineScope, + private val preferencesManager: PreferencesManager

, + createPreferencesEditor: (P) -> PreferencesEditor

+) { + val preferences: StateFlow

= preferencesManager.preferences + + val editor: StateFlow> = preferences + .mapStateIn(viewModelScope, createPreferencesEditor) + + fun commit() { + viewModelScope.launch { + preferencesManager.setPreferences(editor.value.preferences) + } + } +} diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/EmphasisProvider.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/EmphasisProvider.kt new file mode 100644 index 0000000000..c22f960388 --- /dev/null +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/EmphasisProvider.kt @@ -0,0 +1,47 @@ +/* + * Copyright 2024 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +package org.readium.navigator.demo.util + +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ProvideTextStyle +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.ProvidedValue +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight + +val LocalContentEmphasis = compositionLocalOf { Emphasis.Medium } + +enum class Emphasis { + Disabled, + Medium, + High +} + +@Composable +fun EmphasisProvider(emphasis: ProvidedValue, content: @Composable () -> Unit) { + val contentColor = when (emphasis.value) { + Emphasis.Disabled -> MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f) + Emphasis.Medium -> MaterialTheme.colorScheme.onSurfaceVariant + Emphasis.High -> MaterialTheme.colorScheme.onSurface + } + val fontWeight = when (emphasis.value) { + Emphasis.High -> FontWeight.Bold + else -> FontWeight.Normal + } + + CompositionLocalProvider( + LocalContentColor provides contentColor, + content = { + ProvideTextStyle(value = TextStyle(fontWeight = fontWeight)) { + content() + } + } + ) +} diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Group.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Group.kt new file mode 100644 index 0000000000..c4b2d88dd9 --- /dev/null +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Group.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2024 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +package org.readium.navigator.demo.util + +import androidx.compose.runtime.Composable + +/** + * Sets the emphasis (alpha) of a group of [Composable] views. + */ +@Composable +fun Group(enabled: Boolean = true, content: @Composable () -> Unit) { + val emphasis = when { + !enabled -> Emphasis.Disabled + else -> Emphasis.Medium + } + EmphasisProvider(LocalContentEmphasis provides emphasis) { + content() + } +} diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/ToggleButton.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/ToggleButton.kt new file mode 100644 index 0000000000..8650c78f7a --- /dev/null +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/ToggleButton.kt @@ -0,0 +1,94 @@ +/* + * Copyright 2024 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +package org.readium.navigator.demo.util + +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.compositeOver +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp + +// A very basic implementation of Material Design's Toggle Button for Compose. +// https://material.io/components/buttons#toggle-button + +@Composable +fun ToggleButtonGroup( + options: List, + activeOption: T?, + selectedOption: T?, + onSelectOption: (T) -> Unit, + enabled: (T) -> Boolean = { true }, + content: @Composable RowScope.(T) -> Unit +) { + Row { + for (option in options) { + ToggleButton( + enabled = enabled(option), + active = activeOption == option, + selected = selectedOption == option, + onClick = { onSelectOption(option) }, + content = { content(option) } + ) + } + } +} + +@Composable +fun ToggleButton( + modifier: Modifier = Modifier, + onClick: () -> Unit, + enabled: Boolean = true, + active: Boolean = false, + selected: Boolean = false, + content: @Composable RowScope.() -> Unit +) { + OutlinedButton( + modifier = modifier, + onClick = onClick, + enabled = enabled, + content = content, + colors = ButtonDefaults.outlinedButtonColors( + contentColor = MaterialTheme.colorScheme.onBackground, + containerColor = when { + selected -> + MaterialTheme.colorScheme.onBackground + .copy(alpha = 0.15f) + .compositeOver(MaterialTheme.colorScheme.background) + active -> + MaterialTheme.colorScheme.onBackground + .copy(alpha = 0.05f) + .compositeOver(MaterialTheme.colorScheme.background) + else -> MaterialTheme.colorScheme.surface + } + ), + elevation = + if (selected) { + ButtonDefaults.buttonElevation(defaultElevation = 2.dp) + } else { + null + } + ) +} + +@Composable +@Preview(showBackground = true) +fun PreviewToggleButtonGroup() { + ToggleButtonGroup( + options = listOf("1", "2", "3"), + activeOption = "2", + selectedOption = "2", + onSelectOption = {} + ) { option -> + Text(text = option) + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt index eae03496da..2b8f3f1635 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt @@ -48,7 +48,7 @@ public class NavigatorState internal constructor( private val layoutResolver = LayoutResolver(readingOrder.items.map { LayoutResolver.Page(it.href, it.position) }) - private val preferences: MutableState = + public val preferences: MutableState = mutableStateOf(initialPreferences) public val settings: State = diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt index 827806b323..49d9a55e41 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt @@ -1,7 +1,6 @@ package org.readium.navigator.web import android.annotation.SuppressLint -import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.fillMaxSize @@ -12,19 +11,16 @@ import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Size -import androidx.compose.ui.input.nestedscroll.NestedScrollConnection -import org.readium.navigator.web.javascript.PrepaginatedDoubleLayout -import org.readium.navigator.web.javascript.PrepaginatedSingleLayout -import org.readium.navigator.web.util.LoggingNestedScrollConnection -import org.readium.navigator.web.util.LoggingTargetedFlingBehavior +import org.readium.navigator.web.logging.LoggingNestedScrollConnection +import org.readium.navigator.web.logging.LoggingTargetedFlingBehavior import org.readium.navigator.web.util.PagerNestedConnection import org.readium.navigator.web.util.WebViewServer +import org.readium.navigator.web.webapi.PrepaginatedDoubleLayout +import org.readium.navigator.web.webapi.PrepaginatedSingleLayout import org.readium.navigator.web.webview.WebView import org.readium.navigator.web.webview.rememberWebViewStateWithHTMLData import org.readium.r2.shared.ExperimentalReadiumApi -import timber.log.Timber -@OptIn(ExperimentalFoundationApi::class) @SuppressLint("SetJavaScriptEnabled") @ExperimentalReadiumApi @Composable @@ -58,7 +54,6 @@ public fun NavigatorView( propagateMinConstraints = true ) { val size = Size(maxWidth.value, maxHeight.value) - Timber.d("size $size") val webViewState = when (val spread = state.spreads.value[it]) { is LayoutResolver.Spread.Double -> @@ -108,5 +103,3 @@ public fun NavigatorView( } } } - -private val NoOpScrollConnection = object : NestedScrollConnection {} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/AndroidScrollable.android.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/AndroidScrollable.android.kt index d96fb200a7..93c856adb0 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/AndroidScrollable.android.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/AndroidScrollable.android.kt @@ -1,3 +1,19 @@ +/* + * Copyright 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.readium.navigator.web.gestures import androidx.compose.ui.geometry.Offset diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingNestedScrollConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/logging/LoggingNestedScrollConnection.kt similarity index 97% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingNestedScrollConnection.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/logging/LoggingNestedScrollConnection.kt index eb3b39fddc..0107352978 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingNestedScrollConnection.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/logging/LoggingNestedScrollConnection.kt @@ -1,4 +1,4 @@ -package org.readium.navigator.web.util +package org.readium.navigator.web.logging import androidx.compose.ui.geometry.Offset import androidx.compose.ui.input.nestedscroll.NestedScrollConnection diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingTargetedFlingBehavior.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/logging/LoggingTargetedFlingBehavior.kt similarity index 93% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingTargetedFlingBehavior.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/logging/LoggingTargetedFlingBehavior.kt index b0b12d2042..2f792c590c 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/LoggingTargetedFlingBehavior.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/logging/LoggingTargetedFlingBehavior.kt @@ -1,4 +1,4 @@ -package org.readium.navigator.web.util +package org.readium.navigator.web.logging import androidx.compose.foundation.gestures.ScrollScope import androidx.compose.foundation.gestures.TargetedFlingBehavior diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorDefaults.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorDefaults.kt index aaecf82d48..91adbdec32 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorDefaults.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorDefaults.kt @@ -1,9 +1,12 @@ package org.readium.navigator.web.preferences +import org.readium.r2.navigator.preferences.Fit import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi @ExperimentalReadiumApi public data class NavigatorDefaults( - val readingProgression: ReadingProgression? = null + val fit: Fit? = Fit.CONTAIN, + val readingProgression: ReadingProgression? = null, + val spreads: Boolean? = false ) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferences.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferences.kt index adabd558a8..f5ca1d575d 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferences.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferences.kt @@ -14,6 +14,10 @@ public data class NavigatorPreferences( val spreads: Boolean? = null ) : Configurable.Preferences { + init { + require(fit in listOf(null, Fit.CONTAIN, Fit.WIDTH, Fit.HEIGHT)) + } + override operator fun plus(other: NavigatorPreferences): NavigatorPreferences = NavigatorPreferences( fit = other.fit ?: fit, diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesEditor.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesEditor.kt index 713909eb14..c0d2d9684f 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesEditor.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesEditor.kt @@ -6,7 +6,13 @@ package org.readium.navigator.web.preferences -import org.readium.r2.navigator.preferences.* +import org.readium.r2.navigator.preferences.EnumPreference +import org.readium.r2.navigator.preferences.EnumPreferenceDelegate +import org.readium.r2.navigator.preferences.Fit +import org.readium.r2.navigator.preferences.Preference +import org.readium.r2.navigator.preferences.PreferenceDelegate +import org.readium.r2.navigator.preferences.PreferencesEditor +import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.InternalReadiumApi import org.readium.r2.shared.publication.Metadata @@ -50,7 +56,7 @@ public class NavigatorPreferencesEditor internal constructor( getEffectiveValue = { state.settings.fit }, getIsEffective = { true }, updateValue = { value -> updateValues { it.copy(fit = value) } }, - supportedValues = listOf(Fit.CONTAIN, Fit.WIDTH, Fit.HEIGHT, Fit.COVER) + supportedValues = listOf(Fit.CONTAIN, Fit.WIDTH, Fit.HEIGHT) ) public val readingProgression: EnumPreference = @@ -62,6 +68,14 @@ public class NavigatorPreferencesEditor internal constructor( supportedValues = listOf(ReadingProgression.LTR, ReadingProgression.RTL) ) + public val spreads: Preference = + PreferenceDelegate( + getValue = { preferences.spreads }, + getEffectiveValue = { state.settings.spreads }, + getIsEffective = { true }, + updateValue = { value -> updateValues { it.copy(spreads = value) } } + ) + private fun updateValues(updater: (NavigatorPreferences) -> NavigatorPreferences) { val newPreferences = updater(preferences) state = newPreferences.toState() diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettingsResolver.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettingsResolver.kt index b2a444f056..dbeb956890 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettingsResolver.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettingsResolver.kt @@ -22,13 +22,14 @@ internal class NavigatorSettingsResolver( } ?: defaults.readingProgression ?: ReadingProgression.LTR - val fit: Fit = - preferences.fit ?: Fit.CONTAIN + val fit = preferences.fit ?: defaults.fit ?: Fit.CONTAIN + + val spreads = preferences.spreads ?: defaults.spreads ?: false return NavigatorSettings( fit = fit, readingProgression = readingProgression, - spreads = preferences.spreads ?: false + spreads = spreads ) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt index 5f059ef8d5..64d8fb6b8d 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt @@ -9,7 +9,6 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.unit.Velocity import kotlin.math.abs -import timber.log.Timber internal class PagerNestedConnection( private val state: PagerState, @@ -17,17 +16,6 @@ internal class PagerNestedConnection( private val orientation: Orientation ) : NestedScrollConnection { - private fun Velocity.consumeOnOrientation(orientation: Orientation): Velocity { - return if (orientation == Orientation.Vertical) { - copy(x = 0f) - } else { - copy(y = 0f) - } - } - - private fun Offset.mainAxis(): Float = - if (orientation == Orientation.Horizontal) this.x else this.y - private val PagerState.firstVisibleOffset get() = layoutInfo.visiblePagesInfo.first().offset @@ -35,10 +23,7 @@ internal class PagerNestedConnection( layoutInfo.visiblePagesInfo.last().offset override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { - Timber.d("pagerNestedConnection preScroll available $available") - if (state.layoutInfo.visiblePagesInfo.size <= 1) { - Timber.d("pagerNestedConnection only one page $available") return Offset.Zero } @@ -53,35 +38,10 @@ internal class PagerNestedConnection( val maxBound = (state.layoutInfo.pageSize - state.lastVisibleOffset).toFloat() - /* - // find the current and next page (in the direction of dragging) - val currentPageOffset = state.currentPageOffsetFraction * state.layoutInfo.pageSize - val pageAvailableSpace = state.layoutInfo.pageSize + state.layoutInfo.pageSpacing - val nextClosestPageOffset = - currentPageOffset + pageAvailableSpace * -sign(state.currentPageOffsetFraction) - - val minBound: Float - val maxBound: Float - // build min and max bounds in absolute coordinates for nested scroll - if (state.currentPageOffsetFraction > 0f) { - minBound = nextClosestPageOffset - maxBound = currentPageOffset - } else { - minBound = currentPageOffset - maxBound = nextClosestPageOffset - } - - - */ - - Timber.d("delta $delta minBound $minBound maxBound $maxBound") - val coerced = delta.coerceIn(minBound, maxBound) // dispatch and return reversed as usual val consumed = -state.dispatchRawDelta(-coerced) - Timber.d("consumed $consumed") - check(state.layoutInfo.visiblePagesInfo.size == 1 || abs(consumed - available.x) < 1) return Offset( x = if (orientation == Orientation.Horizontal) consumed else available.x, @@ -137,20 +97,4 @@ internal class PagerNestedConnection( return Velocity(available.x - remaining, available.y) } - - /*override fun onPostScroll( - consumed: Offset, - available: Offset, - source: NestedScrollSource - ): Offset { - if (source == NestedScrollSource.SideEffect && available.mainAxis() != 0f) { - throw CancellationException() - } - return Offset.Zero - }*/ - - /*override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { - return Velocity.Zero - // return available.consumeOnOrientation(orientation) - }*/ } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PointerDirectionConfig.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PointerDirectionConfig.kt deleted file mode 100644 index b5f3d7ae50..0000000000 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PointerDirectionConfig.kt +++ /dev/null @@ -1,49 +0,0 @@ -package org.readium.navigator.web.util - -import androidx.compose.ui.geometry.Offset -import kotlin.math.abs -import kotlin.math.sign - -/** - * Configures the calculations to get the change amount depending on the dragging type. - * [calculatePostSlopOffset] will return the post offset slop when the touchSlop is reached. - */ -internal interface PointerDirectionConfig { - fun calculateDeltaChange(offset: Offset): Float - fun calculatePostSlopOffset( - totalPositionChange: Offset, - touchSlop: Float - ): Offset -} - -/** - * Used for monitoring changes on X axis. - */ -internal val HorizontalPointerDirectionConfig = object : PointerDirectionConfig { - override fun calculateDeltaChange(offset: Offset): Float = abs(offset.x) - - override fun calculatePostSlopOffset( - totalPositionChange: Offset, - touchSlop: Float - ): Offset { - val finalMainPositionChange = totalPositionChange.x - - (sign(totalPositionChange.x) * touchSlop) - return Offset(finalMainPositionChange, totalPositionChange.y) - } -} - -/** - * Used for monitoring changes on Y axis. - */ -internal val VerticalPointerDirectionConfig = object : PointerDirectionConfig { - override fun calculateDeltaChange(offset: Offset): Float = abs(offset.y) - - override fun calculatePostSlopOffset( - totalPositionChange: Offset, - touchSlop: Float - ): Offset { - val finalMainPositionChange = totalPositionChange.y - - (sign(totalPositionChange.y) * touchSlop) - return Offset(totalPositionChange.x, finalMainPositionChange) - } -} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewDraggableState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewDraggableState.kt deleted file mode 100644 index c6b5bc1f58..0000000000 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewDraggableState.kt +++ /dev/null @@ -1,74 +0,0 @@ -@file:OptIn(ExperimentalFoundationApi::class) - -package org.readium.navigator.web.util - -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.ui.unit.plus -/* -internal class WebViewDraggableState( - private val nestedScrollDispatcher: NestedScrollDispatcher -) : Draggable2DState { - - var webView: RelaxedWebView? = null - - suspend fun onDragStopped(coroutineScope: CoroutineScope, velocity: Velocity) { - nestedScrollDispatcher.coroutineScope.launch { - val preConsumedByParent = nestedScrollDispatcher - .dispatchPreFling(velocity) - val available = velocity - preConsumedByParent - - val consumedPost = - nestedScrollDispatcher.dispatchPostFling( - (available - available), - available - ) - val totalLeft = available - consumedPost - velocity - totalLeft - } - } - - override fun dispatchRawDelta(delta: Offset) { - Timber.d("dispatchRawDelta $delta $this") - val webViewNow = webView ?: return 0f - - val scrollX = webViewNow.scrollX - val maxX = webViewNow.horizontalScrollRange - webViewNow.horizontalScrollExtent - Timber.d("scrollX $scrollX maxX $maxX") - val newX = (scrollX - delta).coerceIn(0f, maxX.toFloat()) - webViewNow.scrollTo(newX.roundToInt(), 0) - val consumed = (scrollX - webViewNow.scrollX).toFloat() - Timber.d("consumed $consumed $this") - return consumed - } - - private val drag2DScope: Drag2DScope = object : Drag2DScope { - override fun dragBy(pixels: Offset) = dispatchDrag(pixels) - } - - private fun Drag2DScope.dispatchDrag(offset: Offset) { - val consumedByPreScroll = nestedScrollDispatcher.dispatchPreScroll(offset, NestedScrollSource.Drag) - - val scrollAvailableAfterPreScroll = offset - consumedByPreScroll - - val consumedBySelfScroll = - dragBy(scrollAvailableAfterPreScroll) - - val deltaAvailableAfterScroll = scrollAvailableAfterPreScroll - consumedBySelfScroll - val consumedByPostScroll = nestedScrollDispatcher.dispatchPostScroll( - consumedBySelfScroll, - deltaAvailableAfterScroll, - NestedScrollSource.Drag - ) - consumedByPreScroll + consumedBySelfScroll + consumedByPostScroll - } - - private val drag2DMutex = MutatorMutex() - - override suspend fun drag( - dragPriority: MutatePriority, - block: suspend Drag2DScope.() -> Unit - ): Unit = coroutineScope { - drag2DMutex.mutateWith(drag2DScope, dragPriority, block) - } -} -*/ diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt index 510a92f51d..92fe7de458 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt @@ -7,7 +7,6 @@ import kotlin.math.sign import org.readium.navigator.web.gestures.DefaultScrollable2DState import org.readium.navigator.web.gestures.Scrollable2DState import org.readium.navigator.web.webview.RelaxedWebView -import timber.log.Timber internal class WebViewScrollable2DState private constructor( private val webViewDeltaDispatcher: WebViewDeltaDispatcher @@ -35,28 +34,16 @@ private class WebViewDeltaDispatcher { val maxX = webViewNow.horizontalScrollRange - webViewNow.horizontalScrollExtent val maxY = webViewNow.verticalScrollRange - webViewNow.verticalScrollExtent - Timber.d("WebViewDeltaDispatcher delta $delta") - Timber.d("WebViewDeltaDispatcher currentScrollX $currentX") - Timber.d("WebViewDeltaDispatcher scrollRangeX ${webViewNow.horizontalScrollRange}") - Timber.d("WebViewDeltaDispatcher scrollExtentX ${webViewNow.horizontalScrollExtent}") - Timber.d("WebViewDeltaDispatcher currentScrollX $currentX") - Timber.d("WebViewDeltaDispatcher currentScrollY $currentY") - // Consume slightly more than delta si we have to because // we don't want the pager to consume any rounding error val newX = (currentX - sign(delta.x) * ceil(abs(delta.x))).toInt().coerceIn(0, maxX) val newY = (currentY - sign(delta.y) * ceil(abs(delta.y))).toInt().coerceIn(0, maxY) webViewNow.scrollTo(newX, newY) - // webViewNow.scrollBy(-delta.x.toInt(), delta.y.toInt()) - - Timber.d("WebViewDeltaDispatcher newScrollX ${webViewNow.scrollX}") - Timber.d("WebViewDeltaDispatcher newScrollY ${webViewNow.scrollY}") // Fake that we never consume more than delta val consumedX = (currentX - webViewNow.scrollX).toFloat().coerceAbsAtMost(abs(delta.x)) val consumedY = (currentY - webViewNow.scrollY).toFloat().coerceAbsAtMost(abs(delta.y)) val consumed = Offset(consumedX, consumedY) - Timber.d("WebViewDeltaDispatcher consumed $consumed") return consumed } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollableState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollableState.kt deleted file mode 100644 index 4df361a8d3..0000000000 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollableState.kt +++ /dev/null @@ -1,68 +0,0 @@ -package org.readium.navigator.web.util - -import androidx.compose.foundation.MutatePriority -import androidx.compose.foundation.MutatorMutex -import androidx.compose.foundation.gestures.ScrollScope -import androidx.compose.foundation.gestures.ScrollableState -import androidx.compose.runtime.mutableStateOf -import kotlin.math.roundToInt -import kotlinx.coroutines.coroutineScope -import org.readium.navigator.web.webview.RelaxedWebView -import timber.log.Timber - -internal class WebViewScrollableState() : ScrollableState { - - init { - Timber.d("Init $this") - } - - var webView: RelaxedWebView? = null - - override fun dispatchRawDelta(delta: Float): Float { - Timber.d("dispatchRawDelta $delta $this") - val webViewNow = webView ?: return 0f - - val scrollX = webViewNow.scrollX - val maxX = webViewNow.horizontalScrollRange - webViewNow.horizontalScrollExtent - Timber.d("scrollX $scrollX maxX $maxX") - val newX = (scrollX - delta).coerceIn(0f, maxX.toFloat()) - webViewNow.scrollTo(newX.roundToInt(), 0) - val consumed = (scrollX - webViewNow.scrollX).toFloat() - Timber.d("consumed $consumed $this") - return consumed - } - - private val scrollScope: ScrollScope = object : ScrollScope { - override fun scrollBy(pixels: Float): Float { - if (pixels.isNaN()) return 0f - return dispatchRawDelta(pixels) - } - } - - private val scrollMutex = MutatorMutex() - - private val isScrollingState = mutableStateOf(false) - - override suspend fun scroll( - scrollPriority: MutatePriority, - block: suspend ScrollScope.() -> Unit - ): Unit = coroutineScope { - scrollMutex.mutateWith(scrollScope, scrollPriority) { - isScrollingState.value = true - try { - block() - } finally { - isScrollingState.value = false - } - } - } - - override val isScrollInProgress: Boolean - get() = isScrollingState.value - - override val canScrollForward: Boolean - get() = webView?.canScrollHorizontally(1) ?: false - - override val canScrollBackward: Boolean - get() = webView?.canScrollHorizontally(-1) ?: false -} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScroller.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScroller.kt deleted file mode 100644 index a04dbf4cb1..0000000000 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScroller.kt +++ /dev/null @@ -1,81 +0,0 @@ -/* -package org.readium.navigator.web.util - -import android.content.Context -import android.graphics.Point -import android.os.Build -import android.webkit.WebView -import android.widget.OverScroller - -internal class WebViewScroller( - private val context: Context, - private val webview: WebView -) : GestureDetector.Listener { - - private val scroller = OverScroller(context) - - override fun onDown() { - // Initiates the decay phase of any active edge effects. - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { - releaseEdgeEffects() - } - - // Aborts any active scroll animations and invalidates. - scroller.forceFinished(true) - webview.postInvalidateOnAnimation() - - return false - } - - override fun onFling(velocityX: Float, velocityY: Float) { - fling((-velocityX).toInt(), (-velocityY).toInt()) - } - - private fun fling(velocityX: Int, velocityY: Int) { - // Initiates the decay phase of any active edge effects. - // On Android 12 and later, the edge effect (stretch) must - // continue. - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { - releaseEdgeEffects() - } - // Flings use math in pixels, as opposed to math based on the viewport. - val surfaceSize: Point = computeScrollSurfaceSize() - val (startX: Int, startY: Int) = scrollerStartViewport.run { - set(currentViewport) - (surfaceSize.x * (left - AXIS_X_MIN) / (AXIS_X_MAX - AXIS_X_MIN)).toInt() to - (surfaceSize.y * (AXIS_Y_MAX - bottom) / (AXIS_Y_MAX - AXIS_Y_MIN)).toInt() - } - // Before flinging, stops the current animation. - scroller.forceFinished(true) - // Begins the animation. - scroller.fling( - // Current scroll position. - startX, - startY, - velocityX, - velocityY, - */ -/* - * Minimum and maximum scroll positions. The minimum scroll - * position is generally 0 and the maximum scroll position - * is generally the content size less the screen size. So if the - * content width is 1000 pixels and the screen width is 200 - * pixels, the maximum scroll offset is 800 pixels. - *//* - - 0, surfaceSize.x - contentRect.width(), - 0, surfaceSize.y - contentRect.height(), - // The edges of the content. This comes into play when using - // the EdgeEffect class to draw "glow" overlays. - contentRect.width() / 2, - contentRect.height() / 2 - ) - // Invalidates to trigger computeScroll(). - webview.postInvalidateOnAnimation() - - override fun onScroll(distanceX: Float, distanceY: Float) { - TODO("Not yet implemented") - } - -} -*/ diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/javascript/PrepaginatedDoubleLayout.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleLayout.kt similarity index 94% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/javascript/PrepaginatedDoubleLayout.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleLayout.kt index 5cdd1ff200..5048334674 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/javascript/PrepaginatedDoubleLayout.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleLayout.kt @@ -1,4 +1,4 @@ -package org.readium.navigator.web.javascript +package org.readium.navigator.web.webapi import android.webkit.WebView import org.readium.navigator.web.LayoutResolver diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/javascript/PrepaginatedSingleLayout.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleLayout.kt similarity index 93% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/javascript/PrepaginatedSingleLayout.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleLayout.kt index ac2cc2caf7..9952055cef 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/javascript/PrepaginatedSingleLayout.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleLayout.kt @@ -1,4 +1,4 @@ -package org.readium.navigator.web.javascript +package org.readium.navigator.web.webapi import android.webkit.WebView import org.readium.navigator.web.LayoutResolver diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/LoggingWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/LoggingWebView.kt deleted file mode 100644 index d74efb3774..0000000000 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/LoggingWebView.kt +++ /dev/null @@ -1,149 +0,0 @@ -package org.readium.navigator.web.webview - -import android.annotation.SuppressLint -import android.content.Context -import android.view.MotionEvent -import android.view.ViewConfiguration -import android.webkit.WebView -import androidx.compose.ui.geometry.Offset -import androidx.compose.ui.input.nestedscroll.NestedScrollDispatcher -import androidx.compose.ui.input.nestedscroll.NestedScrollSource -import kotlin.math.abs -import kotlin.math.sign -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.SupervisorJob -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import org.readium.r2.shared.InternalReadiumApi -import timber.log.Timber - -@OptIn(InternalReadiumApi::class) -internal class LoggingWebView(context: Context) : WebView(context) { - - lateinit var nestedScrollDispatcher: NestedScrollDispatcher - - private val coroutineScope: CoroutineScope = - CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) - - /*init { - val gestureDetector = GestureDetector() - addJavascriptInterface(gestureDetector, "Gestures") - }*/ - - data class State( - val downPosition: Offset, - val lastMoveDest: Offset? = null, - val cumulatedDelta: Offset = Offset.Zero - ) - - private val touchSlop = ViewConfiguration.get(context).scaledTouchSlop - - private var state: State? = null - - private val disallowInterceptTouchEvent: MutableStateFlow = - MutableStateFlow(false) - - init { - disallowInterceptTouchEvent - .onEach { - Timber.d( - if (it) { - "disallowIntercept" - } else { - "allowIntercept" - } - ) - requestDisallowInterceptTouchEvent(it) - } - .launchIn(coroutineScope) - } - - override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { - Timber.d("onInterceptTouchEvent $ev") - val res = super.onInterceptTouchEvent(ev) - // Timber.d("onInterceptTouchEvent $res $ev") - return res - } - - @SuppressLint("ClickableViewAccessibility") - override fun onTouchEvent(event: MotionEvent): Boolean { - Timber.d("onTouchEvent $event") - Timber.d("onTouchEvent ${disallowInterceptTouchEvent.value} $event") - - val eventOffset = Offset(event.x, event.y) - when (event.action) { - MotionEvent.ACTION_DOWN -> { - disallowInterceptTouchEvent.value = false - state = State(downPosition = eventOffset) - } - MotionEvent.ACTION_MOVE -> { - val currentMoveDelta = eventOffset - (state!!.lastMoveDest ?: state!!.downPosition) - val absCurrentMoveDelta = abs(currentMoveDelta) - val cumulatedDelta = state!!.cumulatedDelta + abs(eventOffset) - state = state!!.copy(lastMoveDest = eventOffset, cumulatedDelta = cumulatedDelta) - - val horizontalSign = -sign(currentMoveDelta.x).toInt() - val verticalSign = sign(currentMoveDelta.y).toInt() - - Timber.d("nestedScrollDispatcher.dispatchPreScroll $currentMoveDelta") - val preconsumed = - nestedScrollDispatcher.dispatchPreScroll( - currentMoveDelta, - NestedScrollSource.Drag - ) - - val remaining = currentMoveDelta - preconsumed - val consumed = Offset(remaining.x.toInt().toFloat(), remaining.y.toInt().toFloat()) - - scrollBy(consumed.x.toInt(), consumed.y.toInt()) - - Timber.d( - "nestedScrollDispatcher.dispatchPostScroll ${preconsumed + consumed} ${remaining - consumed}" - ) - nestedScrollDispatcher.dispatchPostScroll( - preconsumed + consumed, - remaining - consumed, - NestedScrollSource.Drag - ) - - val shouldScrollHorizontally = - state!!.isHorizontallyScrolling() && canScrollHorizontally(horizontalSign) - - val shouldScrollVertically = - state!!.isVerticallyScrolling() && canScrollVertically(verticalSign) && - absCurrentMoveDelta.x < 2 * absCurrentMoveDelta.y - - disallowInterceptTouchEvent.value = shouldScrollHorizontally || shouldScrollVertically - } - MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { - disallowInterceptTouchEvent.value = false - state = null - } - } - - val res = super.onTouchEvent(event) - // Timber.d("onTouchEvent $res $event") - return true - } - - private fun State.isVerticallyScrolling() = - cumulatedDelta.y > touchSlop - - private fun State.isHorizontallyScrolling() = - cumulatedDelta.x > touchSlop - - private fun abs(offset: Offset): Offset { - val absX = abs(offset.x) - val absY = abs(offset.y) - return Offset(absX, absY) - } - - override fun dispatchTouchEvent(ev: MotionEvent): Boolean { - Timber.d("dispatchTouchEvent $ev") - val res = super.dispatchTouchEvent(ev) - // Timber.d("dispatchTouchEvent $res $ev") - return res - } -} From 86d7e89661dcf81f8cf1a9e5affcc72d0e6e8579 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Tue, 3 Sep 2024 16:23:14 +0200 Subject: [PATCH 15/61] Complete cleanup --- .../web/prepaginated-double-script.js | 3 +- .../web/prepaginated-double-script.js.map | 2 +- .../web/prepaginated-single-script.js | 3 +- .../web/prepaginated-single-script.js.map | 2 +- .../readium/navigator/web/NavigatorState.kt | 4 + .../readium/navigator/web/NavigatorView.kt | 95 +- .../navigator/web/spread/DoubleSpread.kt | 85 ++ .../navigator/web/spread/SingleSpread.kt | 82 ++ .../navigator/web/spread/SpreadWebView.kt | 33 + .../navigator/web/util/WebViewClient.kt | 3 +- .../web/webapi/PrepaginatedDoubleApi.kt | 28 + .../web/webapi/PrepaginatedDoubleLayout.kt | 20 - .../web/webapi/PrepaginatedSingleApi.kt | 28 + .../web/webapi/PrepaginatedSingleLayout.kt | 19 - .../web/webview/ComposableWebView.kt | 363 ++++++++ .../navigator/web/webview/ComposeWebView.kt | 809 ------------------ 16 files changed, 677 insertions(+), 902 deletions(-) create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleSpread.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleSpread.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt delete mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleLayout.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt delete mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleLayout.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt delete mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposeWebView.kt diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js index 8fc16a46be..7f31f62f99 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js @@ -1 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){var t,e,s,h,n,a,o,r;if(!this.viewport||!this.leftPage.size&&!this.rightPage.size)return;const l={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(l);const g={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(g);const d=(null!==(e=null===(t=this.leftPage.size)||void 0===t?void 0:t.width)&&void 0!==e?e:0)+(null!==(h=null===(s=this.rightPage.size)||void 0===s?void 0:s.width)&&void 0!==h?h:0),m=Math.max(null!==(a=null===(n=this.leftPage.size)||void 0===n?void 0:n.height)&&void 0!==a?a:0,null!==(r=null===(o=this.rightPage.size)||void 0===o?void 0:o.height)&&void 0!==r?r:0),c={width:d,height:m},u=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,c,this.viewport);this.metaViewport.content=(new i).setInitialScale(u).setMinimumScale(u).setWidth(d).setHeight(m).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),n=new e(i,s,h);t.loadSpread=function(t){n.loadSpread(t)},t.setViewport=function(t,i,e,s,h,a){const o={width:t,height:i},r={top:e,left:s,bottom:h,right:a};n.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);n.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); \ No newline at end of file +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){var t,e,s,h,n,a,o,r;if(!this.viewport||!this.leftPage.size&&!this.rightPage.size)return;const l={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(l);const g={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(g);const d=(null!==(e=null===(t=this.leftPage.size)||void 0===t?void 0:t.width)&&void 0!==e?e:0)+(null!==(h=null===(s=this.rightPage.size)||void 0===s?void 0:s.width)&&void 0!==h?h:0),m=Math.max(null!==(a=null===(n=this.leftPage.size)||void 0===n?void 0:n.height)&&void 0!==a?a:0,null!==(r=null===(o=this.rightPage.size)||void 0===o?void 0:o.height)&&void 0!==r?r:0),c={width:d,height:m},u=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,c,this.viewport);this.metaViewport.content=(new i).setInitialScale(u).setMinimumScale(u).setWidth(d).setHeight(m).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),n=new e(i,s,h);t.loadSpread=function(t){n.loadSpread(t)},t.setViewport=function(t,i,e,s,h,a){const o={width:t,height:i},r={top:e,left:s,bottom:h,right:a};n.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);n.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +//# sourceMappingURL=prepaginated-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map index 94422766f9..dabdcd44ce 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/prepaginated/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/prepaginated/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (viewport instanceof HTMLMetaElement) {\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"./fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"./viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n if (!this.viewport || (!this.leftPage.size && !this.rightPage.size)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n const contentWidth = ((_b = (_a = this.leftPage.size) === null || _a === void 0 ? void 0 : _a.width) !== null && _b !== void 0 ? _b : 0) + ((_d = (_c = this.rightPage.size) === null || _c === void 0 ? void 0 : _c.width) !== null && _d !== void 0 ? _d : 0);\n const contentHeight = Math.max((_f = (_e = this.leftPage.size) === null || _e === void 0 ? void 0 : _e.height) !== null && _f !== void 0 ? _f : 0, (_h = (_g = this.rightPage.size) === null || _g === void 0 ? void 0 : _g.height) !== null && _h !== void 0 ? _h : 0);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n let viewport = { width: viewporttWidth, height: viewportHeight };\n let insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","width","height","size","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","_a","_b","_c","_d","_e","_f","_g","_h","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (viewport instanceof HTMLMetaElement) {\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n if (!this.viewport || (!this.leftPage.size && !this.rightPage.size)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n const contentWidth = ((_b = (_a = this.leftPage.size) === null || _a === void 0 ? void 0 : _a.width) !== null && _b !== void 0 ? _b : 0) + ((_d = (_c = this.rightPage.size) === null || _c === void 0 ? void 0 : _c.width) !== null && _d !== void 0 ? _d : 0);\n const contentHeight = Math.max((_f = (_e = this.leftPage.size) === null || _e === void 0 ? void 0 : _e.height) !== null && _f !== void 0 ? _f : 0, (_h = (_g = this.rightPage.size) === null || _g === void 0 ? void 0 : _g.height) !== null && _h !== void 0 ? _h : 0);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","width","height","size","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","_a","_b","_c","_d","_e","_f","_g","_h","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js index 529ff205f9..a5d1c82d86 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js @@ -1 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); \ No newline at end of file +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +//# sourceMappingURL=prepaginated-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map index 768e26abb0..a8d60fb818 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/prepaginated/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/prepaginated/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (viewport instanceof HTMLMetaElement) {\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"./fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"./viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.page.size = this.page.size;\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n let viewport = { width: viewporttWidth, height: viewportHeight };\n let insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","width","height","size","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (viewport instanceof HTMLMetaElement) {\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","width","height","size","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt index 2b8f3f1635..9c891e2ef0 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt @@ -11,6 +11,7 @@ import org.readium.navigator.web.preferences.NavigatorSettings import org.readium.navigator.web.preferences.NavigatorSettingsResolver import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.util.WebViewServer +import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.Metadata import org.readium.r2.shared.util.Url @@ -59,4 +60,7 @@ public class NavigatorState internal constructor( internal val spreads: State> = derivedStateOf { layoutResolver.layout(settings.value) } + + internal val fit: State = + derivedStateOf { settings.value.fit } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt index 49d9a55e41..424ead6de8 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt @@ -1,6 +1,5 @@ package org.readium.navigator.web -import android.annotation.SuppressLint import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.fillMaxSize @@ -9,19 +8,23 @@ import androidx.compose.foundation.pager.PagerDefaults import androidx.compose.foundation.pager.PagerSnapDistance import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Size +import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.unit.LayoutDirection import org.readium.navigator.web.logging.LoggingNestedScrollConnection import org.readium.navigator.web.logging.LoggingTargetedFlingBehavior +import org.readium.navigator.web.spread.DoubleSpread +import org.readium.navigator.web.spread.DoubleSpreadState +import org.readium.navigator.web.spread.SingleSpread +import org.readium.navigator.web.spread.SingleSpreadState import org.readium.navigator.web.util.PagerNestedConnection import org.readium.navigator.web.util.WebViewServer -import org.readium.navigator.web.webapi.PrepaginatedDoubleLayout -import org.readium.navigator.web.webapi.PrepaginatedSingleLayout -import org.readium.navigator.web.webview.WebView -import org.readium.navigator.web.webview.rememberWebViewStateWithHTMLData +import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi -@SuppressLint("SetJavaScriptEnabled") @ExperimentalReadiumApi @Composable public fun NavigatorView( @@ -39,11 +42,15 @@ public fun NavigatorView( ) ) + val reverseLayout = + LocalLayoutDirection.current.toReadingProgression() != state.settings.value.readingProgression + HorizontalPager( modifier = modifier, userScrollEnabled = false, state = pagerState, beyondViewportPageCount = 2, + reverseLayout = reverseLayout, flingBehavior = flingBehavior, pageNestedScrollConnection = LoggingNestedScrollConnection( PagerNestedConnection(pagerState, flingBehavior, Orientation.Horizontal) @@ -53,53 +60,45 @@ public fun NavigatorView( modifier = Modifier.fillMaxSize(), propagateMinConstraints = true ) { - val size = Size(maxWidth.value, maxHeight.value) - - val webViewState = when (val spread = state.spreads.value[it]) { - is LayoutResolver.Spread.Double -> - rememberWebViewStateWithHTMLData( - data = state.fxlSpreadTwo, - baseUrl = WebViewServer.publicationBaseHref.toString(), - onLoaded = { - with(PrepaginatedDoubleLayout()) { - loadSpread(spread) - setViewport(size.width, size.height) - } - } - ) + val viewportState = rememberUpdatedState(Size(maxWidth.value, maxHeight.value)) + when (val spread = state.spreads.value[it]) { is LayoutResolver.Spread.Single -> { - rememberWebViewStateWithHTMLData( - data = state.fxlSpreadOne, - baseUrl = WebViewServer.publicationBaseHref.toString(), - onLoaded = { - with(PrepaginatedSingleLayout()) { - loadSpread(spread) - setViewport(size.width, size.height) - } - } - ) + val spreadState = remember { + SingleSpreadState( + htmlData = state.fxlSpreadOne, + publicationBaseUrl = WebViewServer.publicationBaseHref, + webViewClient = state.webViewClient, + spread = spread, + fit = state.fit, + viewport = viewportState + ) + } + + SingleSpread(state = spreadState) } - } + is LayoutResolver.Spread.Double -> { + val spreadState = remember { + DoubleSpreadState( + htmlData = state.fxlSpreadTwo, + publicationBaseUrl = WebViewServer.publicationBaseHref, + webViewClient = state.webViewClient, + spread = spread, + fit = state.fit, + viewport = viewportState + ) + } - WebView( - modifier = Modifier - .fillMaxSize(), - state = webViewState, - client = state.webViewClient, - onCreated = { webview -> - webview.settings.javaScriptEnabled = true - webview.settings.setSupportZoom(true) - webview.settings.builtInZoomControls = true - webview.settings.displayZoomControls = false - webview.settings.loadWithOverviewMode = true - webview.settings.useWideViewPort = true - webview.isVerticalScrollBarEnabled = false - webview.isHorizontalScrollBarEnabled = false - }, - onDispose = { + DoubleSpread(state = spreadState) } - ) + } } } } + +@OptIn(ExperimentalReadiumApi::class) +private fun LayoutDirection.toReadingProgression(): ReadingProgression = + when (this) { + LayoutDirection.Ltr -> ReadingProgression.LTR + LayoutDirection.Rtl -> ReadingProgression.RTL + } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleSpread.kt new file mode 100644 index 0000000000..008d060e34 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleSpread.kt @@ -0,0 +1,85 @@ +package org.readium.navigator.web.spread + +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.State +import androidx.compose.runtime.remember +import androidx.compose.runtime.snapshotFlow +import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Size +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import org.readium.navigator.web.LayoutResolver +import org.readium.navigator.web.util.WebViewClient +import org.readium.navigator.web.webapi.PrepaginatedDoubleApi +import org.readium.navigator.web.webview.LoadingState +import org.readium.navigator.web.webview.rememberWebViewStateWithHTMLData +import org.readium.r2.navigator.preferences.Fit +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.util.AbsoluteUrl + +@OptIn(ExperimentalReadiumApi::class) +@Composable +internal fun DoubleSpread( + state: DoubleSpreadState +) { + BoxWithConstraints( + modifier = Modifier.fillMaxSize(), + propagateMinConstraints = true + ) { + val webViewState = rememberWebViewStateWithHTMLData( + data = state.htmlData, + baseUrl = state.publicationBaseUrl.toString() + ) + + val webApi = remember(webViewState.webView, webViewState.loadingState) { + webViewState.webView + ?.takeIf { webViewState.loadingState is LoadingState.Finished } + ?.let { + PrepaginatedDoubleApi(it) + } + } + + webApi?.let { api -> + LaunchedEffect(api) { + snapshotFlow { + state.fit.value + }.onEach { + api.setFit(state.fit.value) + }.launchIn(this) + + snapshotFlow { + state.viewport.value + }.onEach { + val (width, height) = state.viewport.value + api.setViewport(width, height) + }.launchIn(this) + + api.loadSpread(state.spread) + } + } + + PageWebView( + state = webViewState, + client = state.webViewClient + ) + } +} + +@OptIn(ExperimentalReadiumApi::class) +internal class DoubleSpreadState( + val htmlData: String, + val publicationBaseUrl: AbsoluteUrl, + val webViewClient: WebViewClient, + val spread: LayoutResolver.Spread.Double, + val fit: State, + val viewport: State +) { + val left: AbsoluteUrl? = + spread.left?.let { publicationBaseUrl.resolve(it) } + + val right: AbsoluteUrl? = + spread.right?.let { publicationBaseUrl.resolve(it) } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleSpread.kt new file mode 100644 index 0000000000..e8082e6192 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleSpread.kt @@ -0,0 +1,82 @@ +package org.readium.navigator.web.spread + +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.State +import androidx.compose.runtime.remember +import androidx.compose.runtime.snapshotFlow +import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Size +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import org.readium.navigator.web.LayoutResolver +import org.readium.navigator.web.util.WebViewClient +import org.readium.navigator.web.webapi.PrepaginatedSingleApi +import org.readium.navigator.web.webview.LoadingState +import org.readium.navigator.web.webview.rememberWebViewStateWithHTMLData +import org.readium.r2.navigator.preferences.Fit +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.util.AbsoluteUrl + +@OptIn(ExperimentalReadiumApi::class) +@Composable +internal fun SingleSpread( + state: SingleSpreadState +) { + BoxWithConstraints( + modifier = Modifier.fillMaxSize(), + propagateMinConstraints = true + ) { + val webViewState = rememberWebViewStateWithHTMLData( + data = state.htmlData, + baseUrl = state.publicationBaseUrl.toString() + ) + + val webApi = remember(webViewState.webView, webViewState.loadingState) { + webViewState.webView + ?.takeIf { webViewState.loadingState is LoadingState.Finished } + ?.let { + PrepaginatedSingleApi(it) + } + } + + webApi?.let { api -> + LaunchedEffect(api) { + snapshotFlow { + state.fit.value + }.onEach { + api.setFit(state.fit.value) + }.launchIn(this) + + snapshotFlow { + state.viewport.value + }.onEach { + val (width, height) = state.viewport.value + api.setViewport(width, height) + }.launchIn(this) + + api.loadSpread(state.spread) + } + } + + PageWebView( + state = webViewState, + client = state.webViewClient + ) + } +} + +@OptIn(ExperimentalReadiumApi::class) +internal class SingleSpreadState( + val htmlData: String, + val publicationBaseUrl: AbsoluteUrl, + val webViewClient: WebViewClient, + val spread: LayoutResolver.Spread.Single, + val fit: State, + val viewport: State +) { + val url: AbsoluteUrl = + publicationBaseUrl.resolve(spread.value) +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt new file mode 100644 index 0000000000..a8046aa31f --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt @@ -0,0 +1,33 @@ +package org.readium.navigator.web.spread + +import android.annotation.SuppressLint +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import org.readium.navigator.web.util.WebViewClient +import org.readium.navigator.web.webview.WebView +import org.readium.navigator.web.webview.WebViewState + +@SuppressLint("SetJavaScriptEnabled") +@Composable +internal fun PageWebView( + state: WebViewState, + client: WebViewClient +) { + WebView( + modifier = Modifier + .fillMaxSize(), + state = state, + client = client, + onCreated = { webview -> + webview.settings.javaScriptEnabled = true + webview.settings.setSupportZoom(true) + webview.settings.builtInZoomControls = true + webview.settings.displayZoomControls = false + webview.settings.loadWithOverviewMode = true + webview.settings.useWideViewPort = true + webview.isVerticalScrollBarEnabled = false + webview.isHorizontalScrollBarEnabled = false + } + ) +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewClient.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewClient.kt index 82a07d98fd..7d2568110b 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewClient.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewClient.kt @@ -3,11 +3,10 @@ package org.readium.navigator.web.util import android.webkit.WebResourceRequest import android.webkit.WebResourceResponse import android.webkit.WebView -import org.readium.navigator.web.webview.AccompanistWebViewClient internal class WebViewClient( private val webViewServer: WebViewServer -) : AccompanistWebViewClient() { +) : android.webkit.WebViewClient() { override fun shouldInterceptRequest( view: WebView, diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt new file mode 100644 index 0000000000..547813a1ce --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt @@ -0,0 +1,28 @@ +package org.readium.navigator.web.webapi + +import android.webkit.WebView +import org.readium.navigator.web.LayoutResolver +import org.readium.navigator.web.util.WebViewServer +import org.readium.r2.navigator.preferences.Fit +import org.readium.r2.shared.ExperimentalReadiumApi + +@OptIn(ExperimentalReadiumApi::class) +internal class PrepaginatedDoubleApi( + private val webView: WebView +) { + + fun loadSpread(spread: LayoutResolver.Spread.Double) { + val leftUrl = spread.left?.let { WebViewServer.publicationBaseHref.resolve(it) } + val rightUrl = spread.right?.let { WebViewServer.publicationBaseHref.resolve(it) } + webView.evaluateJavascript("layout.loadSpread({ left: `$leftUrl`, right: `$rightUrl`});") {} + } + + fun setViewport(width: Float, height: Float) { + webView.evaluateJavascript("layout.setViewport($width, $height, 0, 0, 0, 0);") {} + } + + fun setFit(fit: Fit) { + val script = "layout.setFit(`${fit.value}`);" + webView.evaluateJavascript(script) {} + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleLayout.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleLayout.kt deleted file mode 100644 index 5048334674..0000000000 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleLayout.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.readium.navigator.web.webapi - -import android.webkit.WebView -import org.readium.navigator.web.LayoutResolver -import org.readium.navigator.web.util.WebViewServer -import org.readium.r2.shared.ExperimentalReadiumApi - -@OptIn(ExperimentalReadiumApi::class) -internal class PrepaginatedDoubleLayout { - - fun WebView.loadSpread(spread: LayoutResolver.Spread.Double) { - val leftUrl = spread.left?.let { WebViewServer.publicationBaseHref.resolve(it) } - val rightUrl = spread.right?.let { WebViewServer.publicationBaseHref.resolve(it) } - evaluateJavascript("layout.loadSpread({ left: `$leftUrl`, right: `$rightUrl`});") {} - } - - fun WebView.setViewport(width: Float, height: Float) { - evaluateJavascript("layout.setViewport($width, $height, 0, 0, 0, 0);") {} - } -} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt new file mode 100644 index 0000000000..0af6406a24 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt @@ -0,0 +1,28 @@ +package org.readium.navigator.web.webapi + +import android.webkit.WebView +import org.readium.navigator.web.LayoutResolver +import org.readium.navigator.web.util.WebViewServer +import org.readium.r2.navigator.preferences.Fit +import org.readium.r2.shared.ExperimentalReadiumApi + +@OptIn(ExperimentalReadiumApi::class) +internal class PrepaginatedSingleApi( + private val webView: WebView +) { + fun loadSpread(spread: LayoutResolver.Spread.Single) { + val resourceUrl = WebViewServer.publicationBaseHref.resolve(spread.value) + val script = "layout.loadResource(`$resourceUrl`);" + webView.evaluateJavascript(script) {} + } + + fun setViewport(width: Float, height: Float) { + val script = "layout.setViewport($width, $height, 0, 0, 0, 0);" + webView.evaluateJavascript(script) {} + } + + fun setFit(fit: Fit) { + val script = "layout.setFit(`${fit.value}`);" + webView.evaluateJavascript(script) {} + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleLayout.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleLayout.kt deleted file mode 100644 index 9952055cef..0000000000 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleLayout.kt +++ /dev/null @@ -1,19 +0,0 @@ -package org.readium.navigator.web.webapi - -import android.webkit.WebView -import org.readium.navigator.web.LayoutResolver -import org.readium.navigator.web.util.WebViewServer -import org.readium.r2.shared.ExperimentalReadiumApi - -@OptIn(ExperimentalReadiumApi::class) -internal class PrepaginatedSingleLayout { - - fun WebView.loadSpread(spread: LayoutResolver.Spread.Single) { - val resourceUrl = WebViewServer.publicationBaseHref.resolve(spread.value) - evaluateJavascript("layout.loadResource(`$resourceUrl`);") {} - } - - fun WebView.setViewport(width: Float, height: Float) { - evaluateJavascript("layout.setViewport($width, $height, 0, 0, 0, 0);") {} - } -} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt new file mode 100644 index 0000000000..a8ade2b8fb --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt @@ -0,0 +1,363 @@ +package org.readium.navigator.web.webview + +import android.content.Context +import android.os.Bundle +import android.view.ViewGroup.LayoutParams +import android.webkit.WebChromeClient +import android.webkit.WebResourceError +import android.webkit.WebResourceRequest +import android.webkit.WebView +import android.webkit.WebViewClient +import android.widget.FrameLayout +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.Stable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.runtime.snapshotFlow +import androidx.compose.runtime.snapshots.SnapshotStateList +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.viewinterop.AndroidView +import androidx.core.view.ViewCompat +import androidx.core.view.postDelayed +import androidx.webkit.WebViewCompat +import androidx.webkit.WebViewFeature +import org.readium.navigator.web.gestures.Fling2DBehavior +import org.readium.navigator.web.gestures.scrollable2D +import org.readium.navigator.web.util.WebViewScrollable2DState +import org.readium.navigator.web.webview.LoadingState.Finished +import org.readium.navigator.web.webview.LoadingState.Loading + +/** + * A wrapper around the Android View WebView to provide a basic WebView composable. + * + * If you require more customisation you are most likely better rolling your own and using this + * wrapper as an example. + * + * The WebView attempts to set the layoutParams based on the Compose modifier passed in. If it + * is incorrectly sizing, use the layoutParams composable function instead. + * + * @param state The webview state holder where the Uri to load is defined. + * @param modifier A compose modifier + * @param onCreated Called when the WebView is first created, this can be used to set additional + * settings on the WebView. WebChromeClient and WebViewClient should not be set here as they will be + * subsequently overwritten after this lambda is called. + * @param onDispose Called when the WebView is destroyed. Provides a bundle which can be saved + * if you need to save and restore state in this WebView. + * @param client Provides access to WebViewClient via subclassing + * @param chromeClient Provides access to WebChromeClient via subclassing + * @param factory An optional WebView factory for using a custom subclass of WebView + */ +@Composable +internal fun WebView( + state: WebViewState, + modifier: Modifier = Modifier, + flingBehavior: Fling2DBehavior? = null, + onCreated: (WebView) -> Unit = {}, + onDispose: (WebView) -> Unit = {}, + client: WebViewClient = remember { WebViewClient() }, + chromeClient: WebChromeClient = remember { WebChromeClient() }, + factory: ((Context) -> RelaxedWebView)? = null +) { + BoxWithConstraints( + modifier = modifier, + propagateMinConstraints = true + ) { + // WebView changes it's layout strategy based on + // it's layoutParams. We convert from Compose Modifier to + // layout params here. + val width = + if (constraints.hasFixedWidth) { + LayoutParams.MATCH_PARENT + } else { + LayoutParams.WRAP_CONTENT + } + val height = + if (constraints.hasFixedHeight) { + LayoutParams.MATCH_PARENT + } else { + LayoutParams.WRAP_CONTENT + } + + val layoutParams = FrameLayout.LayoutParams( + width, + height + ) + + LazyRow( + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically, + userScrollEnabled = false, + modifier = Modifier.fillMaxSize() + ) { + item { + WebView( + state, + flingBehavior, + layoutParams, + Modifier.fillParentMaxSize(), + onCreated, + onDispose, + client, + chromeClient, + factory + ) + } + } + } +} + +/** + * A wrapper around the Android View WebView to provide a basic WebView composable. + * + * If you require more customisation you are most likely better rolling your own and using this + * wrapper as an example. + * + * The WebView attempts to set the layoutParams based on the Compose modifier passed in. If it + * is incorrectly sizing, use the layoutParams composable function instead. + * + * @param state The webview state holder where the Uri to load is defined. + * @param layoutParams A FrameLayout.LayoutParams object to custom size the underlying WebView. + * @param modifier A compose modifier + * @param onCreated Called when the WebView is first created, this can be used to set additional + * settings on the WebView. WebChromeClient and WebViewClient should not be set here as they will be + * subsequently overwritten after this lambda is called. + * @param onDispose Called when the WebView is destroyed. Provides a bundle which can be saved + * if you need to save and restore state in this WebView. + * @param client Provides access to WebViewClient via subclassing + * @param chromeClient Provides access to WebChromeClient via subclassing + * @param factory An optional WebView factory for using a custom subclass of WebView + */ +@Composable +internal fun WebView( + state: WebViewState, + flingBehavior: Fling2DBehavior?, + layoutParams: FrameLayout.LayoutParams, + modifier: Modifier = Modifier, + onCreated: (WebView) -> Unit = {}, + onDispose: (WebView) -> Unit = {}, + client: WebViewClient = remember { WebViewClient() }, + chromeClient: WebChromeClient = remember { WebChromeClient() }, + factory: ((Context) -> RelaxedWebView)? = null +) { + val webView = state.webView + + webView?.let { wv -> + LaunchedEffect(wv, state) { + snapshotFlow { state.content }.collect { content -> + state.loadingState = LoadingState.Loading + when (content) { + is WebContent.Url -> { + wv.loadUrl(content.url, content.additionalHttpHeaders) + } + + is WebContent.Data -> { + wv.loadDataWithBaseURL( + content.baseUrl, + content.data, + content.mimeType, + content.encoding, + content.historyUrl + ) + } + } + wv.onContentReady { state.loadingState = LoadingState.Finished } + } + } + } + + val draggableState = remember { WebViewScrollable2DState() } + + AndroidView( + factory = { context -> + (factory?.let { it(context) } ?: RelaxedWebView(context)).apply { + onCreated(this) + ViewCompat.setNestedScrollingEnabled(this, true) + + this.layoutParams = layoutParams + + state.viewState?.let { + this.restoreState(it) + } + + webChromeClient = chromeClient + webViewClient = client + draggableState.webView = this + }.also { state.webView = it } + }, + modifier = modifier + .scrollable2D(draggableState, flingBehavior = flingBehavior), + onRelease = { + onDispose(it) + draggableState.webView = null + state.webView = null + } + ) +} + +internal sealed class WebContent { + internal data class Url( + val url: String, + val additionalHttpHeaders: Map = emptyMap() + ) : WebContent() + + internal data class Data( + val data: String, + val baseUrl: String? = null, + val encoding: String = "utf-8", + val mimeType: String? = null, + val historyUrl: String? = null + ) : WebContent() +} + +/** + * Sealed class for constraining possible loading states. + * See [Loading] and [Finished]. + */ +internal sealed class LoadingState { + /** + * Describes a WebView that has not yet loaded for the first time. + */ + internal data object Initializing : LoadingState() + + /** + * Describes a webview between `onPageStarted` and `onPageFinished` events. + */ + internal data object Loading : LoadingState() + + /** + * Describes a webview that has finished loading content. + */ + internal data object Finished : LoadingState() +} + +/** + * A state holder to hold the state for the WebView. In most cases this will be remembered + * using the rememberWebViewState(uri) function. + */ +@Stable +internal class WebViewState(webContent: WebContent) { + /** + * The content being loaded by the WebView + */ + var content: WebContent by mutableStateOf(webContent) + + /** + * Whether the WebView is currently [LoadingState.Loading] data in its main frame (along with + * progress) or the data loading has [LoadingState.Finished]. See [LoadingState] + */ + internal var loadingState: LoadingState by mutableStateOf(LoadingState.Initializing) + + /** + * A list for errors captured in the last load. Reset when a new page is loaded. + * Errors could be from any resource (iframe, image, etc.), not just for the main page. + * For more fine grained control use the OnError callback of the WebView. + */ + internal val errorsForCurrentRequest: SnapshotStateList = mutableStateListOf() + + /** + * The saved view state from when the view was destroyed last. To restore state, + * use the navigator and only call loadUrl if the bundle is null. + * See WebViewSaveStateSample. + */ + internal var viewState: Bundle? = null + + // We need access to this in the state saver. An internal DisposableEffect or AndroidView + // onDestroy is called after the state saver and so can't be used. + internal var webView by mutableStateOf(null) +} + +/** + * A wrapper class to hold errors from the WebView. + */ +@Immutable +internal data class WebViewError( + /** + * The request the error came from. + */ + val request: WebResourceRequest?, + /** + * The error that was reported. + */ + val error: WebResourceError +) + +/** + * Creates a WebView state that is remembered across Compositions. + * + * @param url The url to load in the WebView + * @param additionalHttpHeaders Optional, additional HTTP headers that are passed to [WebView.loadUrl]. + * Note that these headers are used for all subsequent requests of the WebView. + */ +@Composable +internal fun rememberWebViewState( + url: String, + additionalHttpHeaders: Map = emptyMap() +): WebViewState = + // Rather than using .apply {} here we will recreate the state, this prevents + // a recomposition loop when the webview updates the url itself. + remember { + WebViewState( + WebContent.Url( + url = url, + additionalHttpHeaders = additionalHttpHeaders + ) + ) + }.apply { + this.content = WebContent.Url( + url = url, + additionalHttpHeaders = additionalHttpHeaders + ) + } + +/** + * Creates a WebView state that is remembered across Compositions. + * + * @param data The uri to load in the WebView + */ +@Composable +internal fun rememberWebViewStateWithHTMLData( + data: String, + baseUrl: String? = null, + encoding: String = "utf-8", + mimeType: String? = null, + historyUrl: String? = null +): WebViewState = + remember { + WebViewState(WebContent.Data(data, baseUrl, encoding, mimeType, historyUrl)) + }.apply { + this.content = WebContent.Data( + data, + baseUrl, + encoding, + mimeType, + historyUrl + ) + } + +/** + * Will run the given [action] when the content of the [WebView] is fully laid out. + */ +private fun WebView.onContentReady(action: () -> Unit) { + if (WebViewFeature.isFeatureSupported(WebViewFeature.VISUAL_STATE_CALLBACK)) { + WebViewCompat.postVisualStateCallback(this, 0) { + action() + } + } else { + // On older devices, there's no reliable way to guarantee the page is fully laid out. + // As a workaround, we run a dummy JavaScript, then wait for a short delay before + // assuming it's ready. + evaluateJavascript("true") { + postDelayed(500, action) + } + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposeWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposeWebView.kt deleted file mode 100644 index 98cf343e38..0000000000 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposeWebView.kt +++ /dev/null @@ -1,809 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.readium.navigator.web.webview - -import android.content.Context -import android.graphics.Bitmap -import android.os.Bundle -import android.view.ViewGroup.LayoutParams -import android.webkit.WebChromeClient -import android.webkit.WebResourceError -import android.webkit.WebResourceRequest -import android.webkit.WebView -import android.webkit.WebViewClient -import android.widget.FrameLayout -import androidx.activity.compose.BackHandler -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.BoxWithConstraints -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.lazy.LazyRow -import androidx.compose.runtime.Composable -import androidx.compose.runtime.Immutable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.Stable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateListOf -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.saveable.Saver -import androidx.compose.runtime.saveable.mapSaver -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue -import androidx.compose.runtime.snapshotFlow -import androidx.compose.runtime.snapshots.SnapshotStateList -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.viewinterop.AndroidView -import androidx.core.view.ViewCompat -import androidx.core.view.postDelayed -import androidx.webkit.WebViewCompat -import androidx.webkit.WebViewFeature -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext -import org.readium.navigator.web.gestures.Fling2DBehavior -import org.readium.navigator.web.gestures.scrollable2D -import org.readium.navigator.web.util.WebViewScrollable2DState -import org.readium.navigator.web.webview.LoadingState.Finished -import org.readium.navigator.web.webview.LoadingState.Loading -import timber.log.Timber - -/** - * A wrapper around the Android View WebView to provide a basic WebView composable. - * - * If you require more customisation you are most likely better rolling your own and using this - * wrapper as an example. - * - * The WebView attempts to set the layoutParams based on the Compose modifier passed in. If it - * is incorrectly sizing, use the layoutParams composable function instead. - * - * @param state The webview state holder where the Uri to load is defined. - * @param modifier A compose modifier - * @param captureBackPresses Set to true to have this Composable capture back presses and navigate - * the WebView back. - * @param navigator An optional navigator object that can be used to control the WebView's - * navigation from outside the composable. - * @param onCreated Called when the WebView is first created, this can be used to set additional - * settings on the WebView. WebChromeClient and WebViewClient should not be set here as they will be - * subsequently overwritten after this lambda is called. - * @param onDispose Called when the WebView is destroyed. Provides a bundle which can be saved - * if you need to save and restore state in this WebView. - * @param client Provides access to WebViewClient via subclassing - * @param chromeClient Provides access to WebChromeClient via subclassing - * @param factory An optional WebView factory for using a custom subclass of WebView - */ -@Composable -internal fun WebView( - state: WebViewState, - modifier: Modifier = Modifier, - captureBackPresses: Boolean = true, - flingBehavior: Fling2DBehavior? = null, - navigator: WebViewNavigator = rememberWebViewNavigator(), - onCreated: (WebView) -> Unit = {}, - onDispose: (WebView) -> Unit = {}, - client: AccompanistWebViewClient = remember { AccompanistWebViewClient() }, - chromeClient: AccompanistWebChromeClient = remember { AccompanistWebChromeClient() }, - factory: ((Context) -> WebView)? = null -) { - BoxWithConstraints( - modifier = modifier, - propagateMinConstraints = true - ) { - // WebView changes it's layout strategy based on - // it's layoutParams. We convert from Compose Modifier to - // layout params here. - val width = - if (constraints.hasFixedWidth) { - LayoutParams.MATCH_PARENT - } else { - LayoutParams.WRAP_CONTENT - } - val height = - if (constraints.hasFixedHeight) { - LayoutParams.MATCH_PARENT - } else { - LayoutParams.WRAP_CONTENT - } - - val layoutParams = FrameLayout.LayoutParams( - width, - height - ) - - Timber.d("layoutParams ${layoutParams.width} ${layoutParams.height}") - - LazyRow( - horizontalArrangement = Arrangement.Center, - verticalAlignment = Alignment.CenterVertically, - userScrollEnabled = false, - modifier = Modifier.fillMaxSize() - ) { - item { - WebView( - state, - flingBehavior, - layoutParams, - Modifier.fillParentMaxSize(), - captureBackPresses, - navigator, - onCreated, - onDispose, - client, - chromeClient, - factory - ) - } - } - } -} - -/** - * A wrapper around the Android View WebView to provide a basic WebView composable. - * - * If you require more customisation you are most likely better rolling your own and using this - * wrapper as an example. - * - * The WebView attempts to set the layoutParams based on the Compose modifier passed in. If it - * is incorrectly sizing, use the layoutParams composable function instead. - * - * @param state The webview state holder where the Uri to load is defined. - * @param layoutParams A FrameLayout.LayoutParams object to custom size the underlying WebView. - * @param modifier A compose modifier - * @param captureBackPresses Set to true to have this Composable capture back presses and navigate - * the WebView back. - * @param navigator An optional navigator object that can be used to control the WebView's - * navigation from outside the composable. - * @param onCreated Called when the WebView is first created, this can be used to set additional - * settings on the WebView. WebChromeClient and WebViewClient should not be set here as they will be - * subsequently overwritten after this lambda is called. - * @param onDispose Called when the WebView is destroyed. Provides a bundle which can be saved - * if you need to save and restore state in this WebView. - * @param client Provides access to WebViewClient via subclassing - * @param chromeClient Provides access to WebChromeClient via subclassing - * @param factory An optional WebView factory for using a custom subclass of WebView - */ -@OptIn(ExperimentalFoundationApi::class) -@Composable -internal fun WebView( - state: WebViewState, - flingBehavior: Fling2DBehavior?, - layoutParams: FrameLayout.LayoutParams, - modifier: Modifier = Modifier, - captureBackPresses: Boolean = true, - navigator: WebViewNavigator = rememberWebViewNavigator(), - onCreated: (WebView) -> Unit = {}, - onDispose: (WebView) -> Unit = {}, - client: AccompanistWebViewClient = remember { AccompanistWebViewClient() }, - chromeClient: AccompanistWebChromeClient = remember { AccompanistWebChromeClient() }, - factory: ((Context) -> WebView)? = null -) { - val webView = state.webView - - BackHandler(captureBackPresses && navigator.canGoBack) { - webView?.goBack() - } - - webView?.let { wv -> - LaunchedEffect(wv, navigator) { - with(navigator) { - wv.handleNavigationEvents() - } - } - - LaunchedEffect(wv, state) { - snapshotFlow { state.content }.collect { content -> - when (content) { - is WebContent.Url -> { - Timber.d("Loading URL ${content.url}") - wv.loadUrl(content.url, content.additionalHttpHeaders) - } - - is WebContent.Data -> { - wv.loadDataWithBaseURL( - content.baseUrl, - content.data, - content.mimeType, - content.encoding, - content.historyUrl - ) - wv.onContentReady { content.onLoaded(wv) } - } - - is WebContent.Post -> { - wv.postUrl( - content.url, - content.postData - ) - } - - is WebContent.NavigatorOnly -> { - // NO-OP - } - } - } - } - } - - // Set the state of the client and chrome client - // This is done internally to ensure they always are the same instance as the - // parent Web composable - client.state = state - client.navigator = navigator - chromeClient.state = state - - val draggableState = remember { WebViewScrollable2DState() } - - AndroidView( - factory = { context -> - (RelaxedWebView(context)).apply { - onCreated(this) - ViewCompat.setNestedScrollingEnabled(this, true) - - this.layoutParams = layoutParams - - state.viewState?.let { - this.restoreState(it) - } - - webChromeClient = chromeClient - webViewClient = client - draggableState.webView = this - }.also { state.webView = it } - }, - modifier = modifier - .scrollable2D(draggableState, flingBehavior = flingBehavior), - onRelease = { - onDispose(it) - draggableState.webView = null - } - ) -} - -/** - * AccompanistWebViewClient - * - * A parent class implementation of WebViewClient that can be subclassed to add custom behaviour. - * - * As Accompanist Web needs to set its own web client to function, it provides this intermediary - * class that can be overridden if further custom behaviour is required. - */ -internal open class AccompanistWebViewClient : WebViewClient() { - internal open lateinit var state: WebViewState - internal set - internal open lateinit var navigator: WebViewNavigator - internal set - - override fun onPageStarted(view: WebView, url: String?, favicon: Bitmap?) { - super.onPageStarted(view, url, favicon) - state.loadingState = LoadingState.Loading(0.0f) - state.errorsForCurrentRequest.clear() - state.pageTitle = null - state.pageIcon = null - - state.lastLoadedUrl = url - } - - override fun onPageFinished(view: WebView, url: String?) { - super.onPageFinished(view, url) - state.loadingState = LoadingState.Finished - } - - override fun doUpdateVisitedHistory(view: WebView, url: String?, isReload: Boolean) { - super.doUpdateVisitedHistory(view, url, isReload) - - navigator.canGoBack = view.canGoBack() - navigator.canGoForward = view.canGoForward() - } - - override fun onReceivedError( - view: WebView, - request: WebResourceRequest?, - error: WebResourceError? - ) { - super.onReceivedError(view, request, error) - - if (error != null) { - state.errorsForCurrentRequest.add(WebViewError(request, error)) - } - } -} - -/** - * AccompanistWebChromeClient - * - * A parent class implementation of WebChromeClient that can be subclassed to add custom behaviour. - * - * As Accompanist Web needs to set its own web client to function, it provides this intermediary - * class that can be overridden if further custom behaviour is required. - */ -internal open class AccompanistWebChromeClient : WebChromeClient() { - internal open lateinit var state: WebViewState - internal set - - override fun onReceivedTitle(view: WebView, title: String?) { - super.onReceivedTitle(view, title) - state.pageTitle = title - } - - override fun onReceivedIcon(view: WebView, icon: Bitmap?) { - super.onReceivedIcon(view, icon) - state.pageIcon = icon - } - - override fun onProgressChanged(view: WebView, newProgress: Int) { - super.onProgressChanged(view, newProgress) - if (state.loadingState is LoadingState.Finished) return - state.loadingState = LoadingState.Loading(newProgress / 100.0f) - } -} - -internal sealed class WebContent { - internal data class Url( - val url: String, - val additionalHttpHeaders: Map = emptyMap() - ) : WebContent() - - internal data class Data( - val data: String, - val baseUrl: String? = null, - val encoding: String = "utf-8", - val mimeType: String? = null, - val historyUrl: String? = null, - val onLoaded: WebView.() -> Unit - ) : WebContent() - - internal data class Post( - val url: String, - val postData: ByteArray - ) : WebContent() { - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as Post - - if (url != other.url) return false - if (!postData.contentEquals(other.postData)) return false - - return true - } - - override fun hashCode(): Int { - var result = url.hashCode() - result = 31 * result + postData.contentHashCode() - return result - } - } - - internal data object NavigatorOnly : WebContent() -} - -internal fun WebContent.withUrl(url: String) = when (this) { - is WebContent.Url -> copy(url = url) - else -> WebContent.Url(url) -} - -/** - * Sealed class for constraining possible loading states. - * See [Loading] and [Finished]. - */ -internal sealed class LoadingState { - /** - * Describes a WebView that has not yet loaded for the first time. - */ - internal data object Initializing : LoadingState() - - /** - * Describes a webview between `onPageStarted` and `onPageFinished` events, contains a - * [progress] property which is updated by the webview. - */ - internal data class Loading(val progress: Float) : LoadingState() - - /** - * Describes a webview that has finished loading content. - */ - internal data object Finished : LoadingState() -} - -/** - * A state holder to hold the state for the WebView. In most cases this will be remembered - * using the rememberWebViewState(uri) function. - */ -@Stable -internal class WebViewState(webContent: WebContent) { - var lastLoadedUrl: String? by mutableStateOf(null) - internal set - - /** - * The content being loaded by the WebView - */ - var content: WebContent by mutableStateOf(webContent) - - /** - * Whether the WebView is currently [LoadingState.Loading] data in its main frame (along with - * progress) or the data loading has [LoadingState.Finished]. See [LoadingState] - */ - internal var loadingState: LoadingState by mutableStateOf(LoadingState.Initializing) - internal set - - /** - * Whether the webview is currently loading data in its main frame - */ - internal val isLoading: Boolean - get() = loadingState !is LoadingState.Finished - - /** - * The title received from the loaded content of the current page - */ - internal var pageTitle: String? by mutableStateOf(null) - internal set - - /** - * the favicon received from the loaded content of the current page - */ - internal var pageIcon: Bitmap? by mutableStateOf(null) - internal set - - /** - * A list for errors captured in the last load. Reset when a new page is loaded. - * Errors could be from any resource (iframe, image, etc.), not just for the main page. - * For more fine grained control use the OnError callback of the WebView. - */ - internal val errorsForCurrentRequest: SnapshotStateList = mutableStateListOf() - - /** - * The saved view state from when the view was destroyed last. To restore state, - * use the navigator and only call loadUrl if the bundle is null. - * See WebViewSaveStateSample. - */ - internal var viewState: Bundle? = null - internal set - - // We need access to this in the state saver. An internal DisposableEffect or AndroidView - // onDestroy is called after the state saver and so can't be used. - internal var webView by mutableStateOf(null) -} - -/** - * Allows control over the navigation of a WebView from outside the composable. E.g. for performing - * a back navigation in response to the user clicking the "up" button in a TopAppBar. - * - * @see [rememberWebViewNavigator] - */ -@Stable -internal class WebViewNavigator(private val coroutineScope: CoroutineScope) { - private sealed interface NavigationEvent { - data object Back : NavigationEvent - data object Forward : NavigationEvent - data object Reload : NavigationEvent - data object StopLoading : NavigationEvent - - data class LoadUrl( - val url: String, - val additionalHttpHeaders: Map = emptyMap() - ) : NavigationEvent - - data class LoadHtml( - val html: String, - val baseUrl: String? = null, - val mimeType: String? = null, - val encoding: String? = "utf-8", - val historyUrl: String? = null - ) : NavigationEvent - - data class PostUrl( - val url: String, - val postData: ByteArray - ) : NavigationEvent { - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as PostUrl - - if (url != other.url) return false - if (!postData.contentEquals(other.postData)) return false - - return true - } - - override fun hashCode(): Int { - var result = url.hashCode() - result = 31 * result + postData.contentHashCode() - return result - } - } - } - - private val navigationEvents: MutableSharedFlow = MutableSharedFlow(replay = 1) - - // Use Dispatchers.Main to ensure that the webview methods are called on UI thread - internal suspend fun WebView.handleNavigationEvents(): Nothing = withContext(Dispatchers.Main) { - navigationEvents.collect { event -> - when (event) { - is NavigationEvent.Back -> goBack() - is NavigationEvent.Forward -> goForward() - is NavigationEvent.Reload -> reload() - is NavigationEvent.StopLoading -> stopLoading() - is NavigationEvent.LoadHtml -> loadDataWithBaseURL( - event.baseUrl, - event.html, - event.mimeType, - event.encoding, - event.historyUrl - ) - - is NavigationEvent.LoadUrl -> { - loadUrl(event.url, event.additionalHttpHeaders) - } - - is NavigationEvent.PostUrl -> { - postUrl(event.url, event.postData) - } - } - } - } - - /** - * True when the web view is able to navigate backwards, false otherwise. - */ - internal var canGoBack: Boolean by mutableStateOf(false) - internal set - - /** - * True when the web view is able to navigate forwards, false otherwise. - */ - internal var canGoForward: Boolean by mutableStateOf(false) - internal set - - internal fun loadUrl(url: String, additionalHttpHeaders: Map = emptyMap()) { - coroutineScope.launch { - navigationEvents.emit( - NavigationEvent.LoadUrl( - url, - additionalHttpHeaders - ) - ) - } - } - - internal fun loadHtml( - html: String, - baseUrl: String? = null, - mimeType: String? = null, - encoding: String? = "utf-8", - historyUrl: String? = null - ) { - coroutineScope.launch { - navigationEvents.emit( - NavigationEvent.LoadHtml( - html, - baseUrl, - mimeType, - encoding, - historyUrl - ) - ) - } - } - - internal fun postUrl( - url: String, - postData: ByteArray - ) { - coroutineScope.launch { - navigationEvents.emit( - NavigationEvent.PostUrl( - url, - postData - ) - ) - } - } - - /** - * Navigates the webview back to the previous page. - */ - internal fun navigateBack() { - coroutineScope.launch { navigationEvents.emit(NavigationEvent.Back) } - } - - /** - * Navigates the webview forward after going back from a page. - */ - internal fun navigateForward() { - coroutineScope.launch { navigationEvents.emit(NavigationEvent.Forward) } - } - - /** - * Reloads the current page in the webview. - */ - internal fun reload() { - coroutineScope.launch { navigationEvents.emit(NavigationEvent.Reload) } - } - - /** - * Stops the current page load (if one is loading). - */ - internal fun stopLoading() { - coroutineScope.launch { navigationEvents.emit(NavigationEvent.StopLoading) } - } -} - -/** - * Creates and remembers a [WebViewNavigator] using the default [CoroutineScope] or a provided - * override. - */ -@Composable -internal fun rememberWebViewNavigator( - coroutineScope: CoroutineScope = rememberCoroutineScope() -): WebViewNavigator = remember(coroutineScope) { WebViewNavigator(coroutineScope) } - -/** - * A wrapper class to hold errors from the WebView. - */ -@Immutable -internal data class WebViewError( - /** - * The request the error came from. - */ - val request: WebResourceRequest?, - /** - * The error that was reported. - */ - val error: WebResourceError -) - -/** - * Creates a WebView state that is remembered across Compositions. - * - * @param url The url to load in the WebView - * @param additionalHttpHeaders Optional, additional HTTP headers that are passed to [WebView.loadUrl]. - * Note that these headers are used for all subsequent requests of the WebView. - */ -@Composable -internal fun rememberWebViewState( - url: String, - additionalHttpHeaders: Map = emptyMap() -): WebViewState = -// Rather than using .apply {} here we will recreate the state, this prevents - // a recomposition loop when the webview updates the url itself. - remember { - WebViewState( - WebContent.Url( - url = url, - additionalHttpHeaders = additionalHttpHeaders - ) - ) - }.apply { - this.content = WebContent.Url( - url = url, - additionalHttpHeaders = additionalHttpHeaders - ) - } - -/** - * Creates a WebView state that is remembered across Compositions. - * - * @param data The uri to load in the WebView - */ -@Composable -internal fun rememberWebViewStateWithHTMLData( - data: String, - baseUrl: String? = null, - encoding: String = "utf-8", - mimeType: String? = null, - historyUrl: String? = null, - onLoaded: WebView.() -> Unit -): WebViewState = - remember { - WebViewState(WebContent.Data(data, baseUrl, encoding, mimeType, historyUrl, onLoaded)) - }.apply { - this.content = WebContent.Data( - data, - baseUrl, - encoding, - mimeType, - historyUrl, - onLoaded - ) - } - -/** - * Creates a WebView state that is remembered across Compositions. - * - * @param url The url to load in the WebView - * @param postData The data to be posted to the WebView with the url - */ -@Composable -internal fun rememberWebViewState( - url: String, - postData: ByteArray -): WebViewState = -// Rather than using .apply {} here we will recreate the state, this prevents - // a recomposition loop when the webview updates the url itself. - remember { - WebViewState( - WebContent.Post( - url = url, - postData = postData - ) - ) - }.apply { - this.content = WebContent.Post( - url = url, - postData = postData - ) - } - -/** - * Creates a WebView state that is remembered across Compositions and saved - * across activity recreation. - * When using saved state, you cannot change the URL via recomposition. The only way to load - * a URL is via a WebViewNavigator. - */ -@Composable -internal fun rememberSaveableWebViewState(): WebViewState = - rememberSaveable(saver = WebStateSaver) { - WebViewState(WebContent.NavigatorOnly) - } - -internal val WebStateSaver: Saver = run { - val pageTitleKey = "pagetitle" - val lastLoadedUrlKey = "lastloaded" - val stateBundle = "bundle" - - mapSaver( - save = { - val viewState = Bundle().apply { it.webView?.saveState(this) } - mapOf( - pageTitleKey to it.pageTitle, - lastLoadedUrlKey to it.lastLoadedUrl, - stateBundle to viewState - ) - }, - restore = { - WebViewState(WebContent.NavigatorOnly).apply { - this.pageTitle = it[pageTitleKey] as String? - this.lastLoadedUrl = it[lastLoadedUrlKey] as String? - this.viewState = it[stateBundle] as Bundle? - } - } - ) -} - -/** - * Will run the given [action] when the content of the [WebView] is fully laid out. - */ -private fun WebView.onContentReady(action: () -> Unit) { - if (WebViewFeature.isFeatureSupported(WebViewFeature.VISUAL_STATE_CALLBACK)) { - WebViewCompat.postVisualStateCallback(this, 0) { - action() - } - } else { - // On older devices, there's no reliable way to guarantee the page is fully laid out. - // As a workaround, we run a dummy JavaScript, then wait for a short delay before - // assuming it's ready. - evaluateJavascript("true") { - postDelayed(500, action) - } - } -} From 0fe83885cc9c2e7a0206497ca92272549ccebefd Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Tue, 3 Sep 2024 16:33:16 +0200 Subject: [PATCH 16/61] Remove scripts --- readium/navigators/web/scripts | 1 - 1 file changed, 1 deletion(-) delete mode 160000 readium/navigators/web/scripts diff --git a/readium/navigators/web/scripts b/readium/navigators/web/scripts deleted file mode 160000 index a4b111c771..0000000000 --- a/readium/navigators/web/scripts +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a4b111c77172e27e7e4b3800d04a0307d41051b8 From e32842f54a3868ce61e64034c38a86bdd6b2e677 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Tue, 3 Sep 2024 16:33:44 +0200 Subject: [PATCH 17/61] Add TS Code --- readium/navigators/web/scripts/.eslintrc.json | 16 + readium/navigators/web/scripts/.gitignore | 1 + .../navigators/web/scripts/.prettierignore | 1 + .../navigators/web/scripts/.prettierrc.json | 0 .../navigators/web/scripts/OEBPS/ANewDay.png | Bin 0 -> 13817 bytes .../web/scripts/OEBPS/BellaTheDragonAFF.jpg | Bin 0 -> 44068 bytes .../web/scripts/OEBPS/BellaTheDragonRA.png | Bin 0 -> 68335 bytes .../web/scripts/OEBPS/BellaYODAFF.jpg | Bin 0 -> 51100 bytes .../web/scripts/OEBPS/BellaYODPrintCover.jpg | Bin 0 -> 38283 bytes .../web/scripts/OEBPS/BellaYODRA.png | Bin 0 -> 84513 bytes .../web/scripts/OEBPS/ILoveToDoodle.jpg | Bin 0 -> 51471 bytes .../web/scripts/OEBPS/ILoveToDoodle.png | Bin 0 -> 48973 bytes .../navigators/web/scripts/OEBPS/LearnSVG.png | Bin 0 -> 28264 bytes .../web/scripts/OEBPS/LookAround.jpg | Bin 0 -> 32945 bytes .../web/scripts/OEBPS/WatchMeGrow.png | Bin 0 -> 60550 bytes .../navigators/web/scripts/OEBPS/bella0.xhtml | 1 + .../navigators/web/scripts/OEBPS/bella1.xhtml | 1 + .../web/scripts/OEBPS/bella10.xhtml | 1 + .../web/scripts/OEBPS/bella11.xhtml | 1 + .../web/scripts/OEBPS/bella12.xhtml | 1 + .../web/scripts/OEBPS/bella13.xhtml | 1 + .../web/scripts/OEBPS/bella14.xhtml | 1 + .../web/scripts/OEBPS/bella15.xhtml | 1 + .../web/scripts/OEBPS/bella16.xhtml | 1 + .../web/scripts/OEBPS/bella17.xhtml | 1 + .../web/scripts/OEBPS/bella18.xhtml | 1 + .../web/scripts/OEBPS/bella19.xhtml | 1 + .../navigators/web/scripts/OEBPS/bella2.xhtml | 1 + .../web/scripts/OEBPS/bella20.xhtml | 1 + .../web/scripts/OEBPS/bella21.xhtml | 1 + .../web/scripts/OEBPS/bella22.xhtml | 1 + .../navigators/web/scripts/OEBPS/bella3.xhtml | 1 + .../navigators/web/scripts/OEBPS/bella4.xhtml | 1 + .../navigators/web/scripts/OEBPS/bella5.xhtml | 1 + .../navigators/web/scripts/OEBPS/bella6.xhtml | 1 + .../navigators/web/scripts/OEBPS/bella7.xhtml | 1 + .../navigators/web/scripts/OEBPS/bella8.xhtml | 1 + .../navigators/web/scripts/OEBPS/bella9.xhtml | 1 + readium/navigators/web/scripts/OEBPS/bm.png | Bin 0 -> 20753 bytes .../navigators/web/scripts/OEBPS/books.xhtml | 1 + .../navigators/web/scripts/OEBPS/books2.xhtml | 1 + .../navigators/web/scripts/OEBPS/books3.xhtml | 1 + .../navigators/web/scripts/OEBPS/books4.xhtml | 1 + .../navigators/web/scripts/OEBPS/content.opf | 1 + .../navigators/web/scripts/OEBPS/cover.jpg | Bin 0 -> 163191 bytes .../navigators/web/scripts/OEBPS/cover.xhtml | 25 + .../navigators/web/scripts/OEBPS/info.xhtml | 1 + .../navigators/web/scripts/OEBPS/jewels.jpg | Bin 0 -> 66151 bytes readium/navigators/web/scripts/OEBPS/ll.png | Bin 0 -> 56578 bytes .../navigators/web/scripts/OEBPS/logotail.jpg | Bin 0 -> 23756 bytes readium/navigators/web/scripts/OEBPS/lr.png | Bin 0 -> 56351 bytes .../navigators/web/scripts/OEBPS/page01.jpg | Bin 0 -> 51021 bytes .../navigators/web/scripts/OEBPS/page02.jpg | Bin 0 -> 67137 bytes .../navigators/web/scripts/OEBPS/page03.jpg | Bin 0 -> 91966 bytes .../navigators/web/scripts/OEBPS/page04.jpg | Bin 0 -> 85318 bytes .../navigators/web/scripts/OEBPS/page05.jpg | Bin 0 -> 83721 bytes .../navigators/web/scripts/OEBPS/page07.jpg | Bin 0 -> 68602 bytes .../navigators/web/scripts/OEBPS/page08.jpg | Bin 0 -> 67539 bytes .../navigators/web/scripts/OEBPS/page09.jpg | Bin 0 -> 55182 bytes .../navigators/web/scripts/OEBPS/page10.jpg | Bin 0 -> 78660 bytes .../navigators/web/scripts/OEBPS/page11.jpg | Bin 0 -> 67998 bytes .../navigators/web/scripts/OEBPS/page12.jpg | Bin 0 -> 51760 bytes .../navigators/web/scripts/OEBPS/page13.jpg | Bin 0 -> 52612 bytes .../navigators/web/scripts/OEBPS/page14.jpg | Bin 0 -> 68811 bytes .../navigators/web/scripts/OEBPS/page15-1.jpg | Bin 0 -> 12946 bytes .../navigators/web/scripts/OEBPS/page15-2.jpg | Bin 0 -> 11508 bytes .../navigators/web/scripts/OEBPS/page15-3.jpg | Bin 0 -> 10181 bytes .../navigators/web/scripts/OEBPS/page16.jpg | Bin 0 -> 73418 bytes .../navigators/web/scripts/OEBPS/page17.jpg | Bin 0 -> 74288 bytes .../navigators/web/scripts/OEBPS/page18.jpg | Bin 0 -> 55753 bytes .../navigators/web/scripts/OEBPS/page19.jpg | Bin 0 -> 62242 bytes .../navigators/web/scripts/OEBPS/page20.jpg | Bin 0 -> 36500 bytes .../navigators/web/scripts/OEBPS/page22.jpg | Bin 0 -> 64159 bytes .../navigators/web/scripts/OEBPS/styles.css | 185 + .../navigators/web/scripts/OEBPS/toc.xhtml | 1 + readium/navigators/web/scripts/OEBPS/ul.png | Bin 0 -> 56405 bytes readium/navigators/web/scripts/OEBPS/um.png | Bin 0 -> 20246 bytes readium/navigators/web/scripts/OEBPS/ur.png | Bin 0 -> 56327 bytes readium/navigators/web/scripts/README.md | 5 + .../navigators/web/scripts/babel.config.json | 3 + .../dist/prepaginated-double-index.html | 46 + .../dist/prepaginated-double-script.js | 2 + .../dist/prepaginated-double-script.js.map | 1 + .../dist/prepaginated-single-index.html | 37 + .../dist/prepaginated-single-script.js | 2 + .../dist/prepaginated-single-script.js.map | 1 + readium/navigators/web/scripts/package.json | 40 + readium/navigators/web/scripts/pnpm-lock.yaml | 4067 +++++++++++++++++ .../public/prepaginated-double-index.html | 46 + .../public/prepaginated-single-index.html | 37 + .../web/scripts/src/common/types.ts | 18 + .../scripts/src/index-prepaginated-double.ts | 59 + .../scripts/src/index-prepaginated-single.ts | 75 + .../src/prepaginated/double-area-manager.ts | 88 + .../scripts/src/prepaginated/page-manager.ts | 93 + .../src/prepaginated/single-area-manager.ts | 74 + .../navigators/web/scripts/src/util/fit.ts | 33 + .../web/scripts/src/util/viewport.ts | 53 + readium/navigators/web/scripts/tsconfig.json | 12 + .../navigators/web/scripts/webpack.config.js | 39 + readium/navigators/web/scripts/x | 0 101 files changed, 5089 insertions(+) create mode 100644 readium/navigators/web/scripts/.eslintrc.json create mode 100644 readium/navigators/web/scripts/.gitignore create mode 100644 readium/navigators/web/scripts/.prettierignore create mode 100644 readium/navigators/web/scripts/.prettierrc.json create mode 100644 readium/navigators/web/scripts/OEBPS/ANewDay.png create mode 100644 readium/navigators/web/scripts/OEBPS/BellaTheDragonAFF.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/BellaTheDragonRA.png create mode 100644 readium/navigators/web/scripts/OEBPS/BellaYODAFF.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/BellaYODPrintCover.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/BellaYODRA.png create mode 100644 readium/navigators/web/scripts/OEBPS/ILoveToDoodle.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/ILoveToDoodle.png create mode 100644 readium/navigators/web/scripts/OEBPS/LearnSVG.png create mode 100644 readium/navigators/web/scripts/OEBPS/LookAround.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/WatchMeGrow.png create mode 100644 readium/navigators/web/scripts/OEBPS/bella0.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella1.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella10.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella11.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella12.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella13.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella14.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella15.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella16.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella17.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella18.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella19.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella2.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella20.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella21.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella22.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella3.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella4.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella5.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella6.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella7.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella8.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bella9.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/bm.png create mode 100644 readium/navigators/web/scripts/OEBPS/books.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/books2.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/books3.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/books4.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/content.opf create mode 100644 readium/navigators/web/scripts/OEBPS/cover.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/cover.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/info.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/jewels.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/ll.png create mode 100644 readium/navigators/web/scripts/OEBPS/logotail.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/lr.png create mode 100644 readium/navigators/web/scripts/OEBPS/page01.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page02.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page03.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page04.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page05.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page07.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page08.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page09.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page10.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page11.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page12.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page13.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page14.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page15-1.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page15-2.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page15-3.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page16.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page17.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page18.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page19.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page20.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/page22.jpg create mode 100644 readium/navigators/web/scripts/OEBPS/styles.css create mode 100644 readium/navigators/web/scripts/OEBPS/toc.xhtml create mode 100644 readium/navigators/web/scripts/OEBPS/ul.png create mode 100644 readium/navigators/web/scripts/OEBPS/um.png create mode 100644 readium/navigators/web/scripts/OEBPS/ur.png create mode 100644 readium/navigators/web/scripts/README.md create mode 100644 readium/navigators/web/scripts/babel.config.json create mode 100644 readium/navigators/web/scripts/dist/prepaginated-double-index.html create mode 100644 readium/navigators/web/scripts/dist/prepaginated-double-script.js create mode 100644 readium/navigators/web/scripts/dist/prepaginated-double-script.js.map create mode 100644 readium/navigators/web/scripts/dist/prepaginated-single-index.html create mode 100644 readium/navigators/web/scripts/dist/prepaginated-single-script.js create mode 100644 readium/navigators/web/scripts/dist/prepaginated-single-script.js.map create mode 100644 readium/navigators/web/scripts/package.json create mode 100644 readium/navigators/web/scripts/pnpm-lock.yaml create mode 100644 readium/navigators/web/scripts/public/prepaginated-double-index.html create mode 100644 readium/navigators/web/scripts/public/prepaginated-single-index.html create mode 100644 readium/navigators/web/scripts/src/common/types.ts create mode 100644 readium/navigators/web/scripts/src/index-prepaginated-double.ts create mode 100644 readium/navigators/web/scripts/src/index-prepaginated-single.ts create mode 100644 readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts create mode 100644 readium/navigators/web/scripts/src/prepaginated/page-manager.ts create mode 100644 readium/navigators/web/scripts/src/prepaginated/single-area-manager.ts create mode 100644 readium/navigators/web/scripts/src/util/fit.ts create mode 100644 readium/navigators/web/scripts/src/util/viewport.ts create mode 100644 readium/navigators/web/scripts/tsconfig.json create mode 100644 readium/navigators/web/scripts/webpack.config.js create mode 100644 readium/navigators/web/scripts/x diff --git a/readium/navigators/web/scripts/.eslintrc.json b/readium/navigators/web/scripts/.eslintrc.json new file mode 100644 index 0000000000..3d82a75f1d --- /dev/null +++ b/readium/navigators/web/scripts/.eslintrc.json @@ -0,0 +1,16 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-namespace": "off" + } + } diff --git a/readium/navigators/web/scripts/.gitignore b/readium/navigators/web/scripts/.gitignore new file mode 100644 index 0000000000..3c3629e647 --- /dev/null +++ b/readium/navigators/web/scripts/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/readium/navigators/web/scripts/.prettierignore b/readium/navigators/web/scripts/.prettierignore new file mode 100644 index 0000000000..cee46cca66 --- /dev/null +++ b/readium/navigators/web/scripts/.prettierignore @@ -0,0 +1 @@ +src/vendor diff --git a/readium/navigators/web/scripts/.prettierrc.json b/readium/navigators/web/scripts/.prettierrc.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/readium/navigators/web/scripts/OEBPS/ANewDay.png b/readium/navigators/web/scripts/OEBPS/ANewDay.png new file mode 100644 index 0000000000000000000000000000000000000000..c7a70ac1febf85fbb5a57819633180decd165b32 GIT binary patch literal 13817 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 F@_z`5CXoOD literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/BellaTheDragonAFF.jpg b/readium/navigators/web/scripts/OEBPS/BellaTheDragonAFF.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1ce474c20f7e5960c78838a16948ea98a354ce5f GIT binary patch literal 44068 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 literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/BellaYODPrintCover.jpg b/readium/navigators/web/scripts/OEBPS/BellaYODPrintCover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd863b48dd2404860b994bc2cb11cdf15da44cc5 GIT binary patch literal 38283 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 literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/BellaYODRA.png b/readium/navigators/web/scripts/OEBPS/BellaYODRA.png new file mode 100644 index 0000000000000000000000000000000000000000..910c4dfe6ee0425cc09a9f03aa63b651cb76689d GIT binary patch literal 84513 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 w7HbYgFz>%07*qoM6N<$f)gD~J^%m! literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/ILoveToDoodle.jpg b/readium/navigators/web/scripts/OEBPS/ILoveToDoodle.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d18f27ca98e442e687adaf726f91e0d817c6c9a9 GIT binary patch literal 51471 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 Qr(y4bE#X74S7NXK*%{a%3jhEB literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/ILoveToDoodle.png b/readium/navigators/web/scripts/OEBPS/ILoveToDoodle.png new file mode 100644 index 0000000000000000000000000000000000000000..a18f5c2cd7f6fdaa6f8ca18e41990f80e18b52e9 GIT binary patch literal 48973 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 z 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 JPDHLkV1i2Gv}6DP literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/LearnSVG.png b/readium/navigators/web/scripts/OEBPS/LearnSVG.png new file mode 100644 index 0000000000000000000000000000000000000000..00cbbafda897bcf5890f186fe9e1bf2105d33ac2 GIT binary patch literal 28264 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 literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/LookAround.jpg b/readium/navigators/web/scripts/OEBPS/LookAround.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4291ce56f3c7e32bce9d97d7d7facd4035157bbf GIT binary patch literal 32945 zcmeFZ2UHYY^C#ToAXz{qC{f8d=Nui$ISIp%hM6Hp0Z{<~i3$iPIY&V<0wR(m=L`yn zWF#vRw!z0Iy#IIi-Lv1>Z_l3f>8?>ej8Ux}m$Lf8BL9e)j2_prV((4FEtO02=@R zxBvkf0APS6G>k`JhW4|J#R8VmFUse2DQMU~`2ae|C;OueHbkTNqYO%+Q2|)zdcZ9U zjrz}W5gNj=_8ETQ(ua~j~|;pG+MH!@sjL07ygs^O*5z7=MFwrp3G10MbuyL_42>8KDQVdLbGF~iMEz8Rc&VhW`qjj^?hCt0x1MDMRm8m? zUfj#BY#sT$uW#cK9G_FwHo9~mtZZQG8Iq7&-9Gl^kQ6{i2d%}tun7knOYp)3dR{V2 z&;n)ZJp+c}Tg9_;xfcD}x%t#b;m)g$3u4I}SCqL++BBD5_4Ob6uc}t< zs4~UI;iZeIvYz$tt7r-7U!Ux{U-q`PhzUtwFF!qc2Hf%`kJtCq=xyRm9C6&=<}6(= zcJ3cm>h3=Tz44dldObd8b8N~^rjy}P78I2?*$lJHUgshku$;KFbc!n2u4>u~D_uW* z8owUmh?vcOWL@p-3JHv8_bk@m(ilc?!u*%g+@->Ng4MH|YYrEZN;l5{?cAdosSjts z*M|5-i@m0odzw*q)`+g|!r}fO=HLa+gf`0gYfBA9lXDdVF(#=HMD=pOSSrl^hSJ8k zBv<^CJoA5IL0-ZUs7%Z>$PgEQ~Va!bso#LHwy+otl!F89ra_(jAY;sB2 z)EUt16E3tFHOkQ}((6?{T6~&T{)1?$Iz;yjFtAx;-MhBp<13lET)bagW;YX&XrL$h zZ5_5hCC^e`Ee;)r`^A@kcv;!w%CC_Hi8bEB83G(&l>G4ZLMZvi5%s#GZhFG?k8 zeSA!CPT8Hj=?DHbFF(o{L?WV~>T?3$yWI-OQ32jhbsPH#7~~YS7qvHHaMwL#4q9DR zFniPxH~DoYZc%8cdZIS+HHIJMk0w>y<&!x7IJM2>7soVes+2|%ajP|T?MOkv(IW_A z%1_y3xi06&8L%-Nx92!Ec%&DHDyf<<>%J!;QX^U&Zw7BUq@Ar_E1A=hr;H3i%15#n z`fYH#26>Qu5~^BzFF4zFQqnMHaGLzRFDG!&$3pYH-|fySc)J~i50g+s%Jcm3QC*YG zz0K?OC@8#q?i=^=O5uv1T#+Yso%+s3)vDqn94*+`TzMge;VSY(Qs3nC>A;?!1>`hC z?MSR*K}X@}ZYWxg=@+}X%)PEAZ^#zR(RKFYD9;tqb{T-oRIM#HcfX)G%gDQ~3O^!h z-xP1kY;VeZrg5Y1^)=9~cSru!yK}c8D`xf;_%~3+W^rZJykm{(J=n>`l zq0%qr*3JO&Blg(R=IMeXF3cgQBRW%A^FYm|YkL9y)q<-IQ7X;;l%geVf>k1VtD?D1 zu89zlO{W8c>hCYZR#gMe2KIG__!l!b`3Pjc<=RaGH)W{2va$yuGh%AmZk-;g>RE|Q z&$41wnOT`)Rn^o4Za+(WJk-i8eKxpH+32sP^=UUY|LDD#0C6a~F@gWV%$(va8$BbU znlY2`hs?cpOsQ#o*?W~oc<;TUD(w=S{M$ZF;-<#B>wZSK8h?Ciwx;6#xf?Rq^Mny9#?YqKKFCv(d zUY3j&(YhYBdx%gDdGD7u|5Y05q3o|cEupWkVVHScSai(ju2dYkzzn?Qw&cjj?bC>o z1F5m~{IH+^6X)46V`o022#ejsJJ9fJIbVEcBRq~wq~C3x!gq(P6+D~1$|jtUJ2%ig z>|QB|&6+MK&ac*jB8oSNq0eRQ?T@&KkHpD)Aqc3cMcv)#cN2utpJ+Ev5%db^L_u_W zIm3~+EHGPTEacNds#Id~VnwkCK9An0ws-Y4yyWrpN8=a4saVq_1^Bm|eG}dpT-e|O zCIUn53#IajapY=)Vbs94j?*(B<8gM@%Nu7yn|&kGWbGA;=AL32wXt~X(#m_fQ~l1* z+eW)z+;5Yyn{EM|FB|7b>PzlVM1O*7)JDKfan}zet3)fRPembHe%Mte@jH&Zgiy(> zuVxnctBBJADt7apq$45dwzSRx&{$UThri?0VpMI}5QDM45*n@1g-Ar9&%&5FQS6D;wddmHs zsrj8H49WJYhNcOl{nxA$wE}zhJS>#hXUriJC{Cg(j8t=e2k04~d}nJAX}g=6S@_*! zx@!WvJ7gqh*`4m1qp$MHY3i}X@`z(e(qV{=rR~h)^=J!UR=9`M99+^uu1i|krft1` z=!CZFH2IV_5sf!5N!p6|in4UJ&VC5}g!lLuw4!cjOlmTG*6&(IL3U|zL`KdTAZXqP z<~rZoiyBjH&7qw2WbM@yCGZ_&dw#red;CLavdPJ5!Z9s-W^V4(!w^KxL=}xM%>v9k z+Ij!FF^8C$$w|CV{Apz0@j+7L<8`%g9)9xydwY)Tz$FZi&ixXPnN8b4-(fk?Gr-F$ zfQ#Y<+0eK26>_&X5*}ve_I;VRhA~H}FkV7KRvUu?x|@ar%Ii*~eMV3ttH$rSf^p10%WR4e2(*S@Tbd9(0F5ZLEFG6&)$DYu~l27Hn+QBR^d8*wPu;_fI(k2BvWY zlapL&%{zmAIP7^h2w}*Mxf6|Ujdl#``M8Ou`9`|PRH&mH+ntWiH-ZnSsFog+W_qr> zr!F;ck6&HTFj{&=AQ1fgR)XMrB=ki=I5)z2BJQqRfY2(&b(5Km8N2DeRo20^^~^CO zbh0^*C|Bo3lC=7k_VP=e`m}zFnn`us5W#NC7}APHs?AmDU0;kr3ZJOG{ZSKs@y67X z-9wV7!pagGog(<2I4d>|-%72rXZ?{$7Hw1a%l_M&r>@@{q}>TA3eSeOINOP_DhaDz z-B3YWXF3D2vV7d;-C-EZF|goYm0Of$zfO`XP=lyn=;c6na5EO<>9 zr7fAZ374Gfuqr$P-g!>A2et-J$F3%W*IR{l{3+CmkS{x`fhNv}v)#RPhk)C;qjNtL zz0MQE*&e%G80G(?Atm*QTi%CD(gJ?3JFF#XI$6lb$<;3hKKRC>_egKz48U6+e|mLt z%7lZrqMm-S1NqT-vY`sKcWw2C$tkRuO9Fe<*&R=u7*KUlsFJGQ9P~+X{g* zZ>Zi+zU81D5He#kN#m zN5SFtTnUw5R>=IHPR^lrJm~hRCp?(-tt3l51iNb*O0cpjM1Oeiv!SX{O{eK%GPrI{ zSTQmD(_>-2^dra*zGW`PbCBvAX)9BkB~42w!s3U|GmZ>bRXb4`ld_c)9Jb5TfYiap z31jN(;~QJ~pJ$fq>YYrWN+4 zen=1O%~a?dc<;@0TKj;vWyyO@?|kNtc(0CDkDnC8t(disp8;nh8{2iRg>~hwj-EL? zpA6yh*1cQV4W}!I>kzMfBqQ_4y!AD@hIabE`ynUP9`m|~0eYJ6R=NHC#j#K`uo&hN zo?9!Tn`o(B#>7RnhkAF`Fy1EZ%!vGWc_S0yA=KV5J97qPLdf`LZ1~eP`~;=is+o)G z%G6<5z?k?jHSH^3y`-0BoE*gwdH!ouRMN{Fz4@LKN$=V=f_c*`@qh%Q7@#H4F`3IIt?WJaUN+Y2J4a*5WKrAxHI>;P@{YbHB~QFd+Jnyk z(dzFGd3_BF#&ek0(5r6~XAKbsoM1}SM>L2tj^s~a^>9I-e>4@EsJ2-;k?gfyV!~5k zb|K0xd86NRKh}Bt(j{pHqJBU1QmC2jju1-6ot(yjckO1KW68KclSjY&jU#HuneUyY zNYPx{s&UgX0~00gT(b;$&$82(5pzwunsq@XHk|rN5gtPIX3LSr3^|mF0ZA_)m#oEa zFm%3@&LVwn`RXtrZ)f+!R7odwS1)^Ic`^qdQ`15!$IKe&zHThl1 zAVr8`M%jytHmI``G zK2DT(xr@u}7vU`IoqQNMC=bE7OM#|IQ&S;6>{_)+aB8qwAnoW^U4H|usJqi9s;qY+ zvi(NSKGoQi>(nXP3$-TY)9Xh=u+3}3$od&fmCKyOUu{=R=a<4uCh4x09o-|^lPHoX zEDQHcc*reP81X`&dTO;{D&SR6;7DEe^8@R8(pvH%%k1uwnaJt!eMzErtP6dzSdpus$|JhXd(4R$?8rdeKa2E?rveCM_+NiOF+p|-D(S~FR3FjMM3xH<)WF?Tc{Yw!;4 zbF7VwigBn-nEZm~UQ+bFC;rO4D$(M}#AnvEi$_)VVnZsMD?Z28PK2g9!*kXXL;}kdpUsUb3*VL zGjBS(M%C{HodG?<4#FBm20^Y|(1)g9OINkN99;$N`-%qVv z6dhTpsaTyhds4pMG&4J=e&d8TKK-NZ{=FykiOYKKcM|Y}9@G=~npKvxiJSokpTTYN zo?kPa%Cpj(C((h0{OENmUFO{1OP)H`j+nQbPbGa=7q@KQz>1uzA3m~JDrihT30M(o zo0*N=U1`tV6Y3k7Ijz4u;x3x(!ZW+%Q~Y`~`)x=~@I>UQg>L;oH8tb+qp2gwADsCb zV=d8sYA2AK@;R;7O}4o!8z(2H?-v;C+79#4&HyFV7b?889Y4gI&c@bX_MfOftg21H zDv6TrQ9vnHR-vsrbB8jzMn_b3XT+43O6-t7<$0MmbJ!Ry?yK26w04%;V_4GiGn| zo>9L#if^_m>^W4|b1)Wqim~T0bsBWDy$K&9xbPi6c&oMO)_pxaQGI=7)9*pCS@>#g z@)KfTny~=s?@igK&Iq^6{#9rR+`PB&iTp+(NBs!3(i|#p;fOZ1_DJBCTV#6V%(&be z@k`@}Nt1q!qa%Kf`60`q`zJZYsl7*Mz{dtb390bZxI`OSrrJK{s%dJdy*(;pNq_7p zrE*l*z3O#9y7~rqx1helRO&;^pd1~MI=e5nzgK3z@8AsO2&ba@0tlnozBX&RohhCf ze#y_^N?;z5>tk%G=hGUsGvJjLVjqcP7PT3Pva zO|;Lx;dw=4v+6-*Yv$xk&l!Mo8Uvn^M?H1kuDYLCbar+3c_^)#??$%0(!_HVs+(A8 zoLny5y|%`c(v3qIjjY{ZplKJOjCPw`5=}O%b(t|){nqBX^3FE%$>IIUb@$TTe%EVe z6=UkO#|x-^+LiS);L?%wSN|8H&WR(W^63_lR#(!i+B8P`)HCbpYbTI`+NM`g&UevL zMypBJ2&KMt4s8 zCjOtpmt@sBGEtMG6iEse(a@#7kYQ5K9 z2sc%v$Ekw_tZk-#&}NG^!(IFgSUu?szRr{W%m*Q8fK?;H!(s-FOuGnRli@qU_)NcFV)aZBRjBtC1*Vr5)9szMqOdy;Lu4?K%m8S|d zBOg9&tO~B{m{#8L4^uPc5dfcC+X4NUy~QO*5TYnjmQbb~`ZNHzF93L`qfo7&tKgmA z#MuU&)L*azKNk-mBBu($Jcld*;0g_zF@QnMto-L5ggDMojtd#)3mKAjvn!w7Dv|qB zjiS%qu6UbX)QMfxRf9PRxSfLo0C3641;jHn+})hq-9Yl<5Sp%TI#wu@xbOr0l&L!oY+>pP_0?oE^`IFGLb%p#%$h#or|00lXe-XE>99{pcxnt|* z@h72(a8&q{0DI;y)pAg{t%j8Y6g>V#7XpB`vYb3ffv6Q&wx*-AM!8$bpgx|H7fIO# z`CoW)j{j9o&c#|+59y}FsO@+@T7M=vM{Bx&$Jcgsbi3eddO6D6z5h!d-vb79L%Aqe zx>=rkaABmTt)}a*aXv4f%YyrJvw_<%o1bd_<*>RSDE99Ts{?iX$=7s&${3w%_&ItQ z8y7_q5NtZ{8nj>gi;=x~QAc!qAzgIb^lr+=rZ8>0o?xRw{tM`kA;3A zOLb0SD1+Hgf6hq&IEN+U!3_^wekj1>VrlXMd>2dg&uM)w_-FcKs$bCOEq?)<|5o4^ z^RGn=Al)6$&mQMzGHff9JJQ^YaJJ1)-|&H{Ce4E+}`Wf3UDoF7~$e z$UjyOfuhd2c8v=jsDseb-3_G-L&97v-C))r1JLz$`gKah|0#UVIj>Pg*wTT!|K0v$ zxVt$1abo^s)XqEqpB#v*?XQ#fPZ?}WM>kzd+kZ$AL1AD!n3tQXtBNk<_OFu(?l1N~ zgz@Z9E!^`iXq>P31{2H$$PkRrdJ&L{N6SqSr79=OtVPJ`R|6*dhlssKO_ zSOkIns~}MS8_53+3r`4J=B?n!{uv_| z6ougSvUK9+<>KK6B&5BZETM3i8=VylM6M(mw(6T0=&n4P_fj|)u4 z=Z-Ga2M!grW{{SmlkgJrLO3B{ZkBXj2uGx=n3p8Og>o^le9q=(pt}%pgG(}8d|pUr z2+^dIN4dc01i5%Pp*%u7bV9sby!-;f!onPM;1`rU+&p~TynLLz!eabBpLp2%G1-6%aflA@VI5pgY$HBHr$9k_@1w7cM|uT>n)2kG_I}FE6-Qa=KW0a)KCGa`;XUu{pQC_q zfC5|edwfmvF6 z%Q`tZ+QY!vqU+)gW1#!fSFzhLTT7_7s-~{Ig1s%w6+Di-g1nNFtgwQth`g|zB9ADK zpfHcHkgTGt5|5xfzkuT3TVKF*5R^4cl7au+IVUlB@NjN0@I3{Pb^g6ACyxLp51%fN zh?t;=7>_U~k03Z_eu{$a>}|aNCd$hLO6&gmH1{8(;8e8+-+lO>62342gcZT}Bz{fm zzh2Gx#}~m2bkv5v1>YF){$p9{z?}am zIoi`*%qTHS==qB`k_@hv9x!W$KbZFa#^?WR_fLhMb}&%g&ruiT-g@ucQON@_C{Qo6<&omH^fd$f+jB=>!J3)n8PcvT&UD366 zYZ;u!z4;Ii|LV0z&lHuiD)fi+Sg3XucF#ljz}$o4eunY+??mwtQ8Bdhdi*@Erel2h z8>^_Qk-c|lVt#Gs#L9OzF*RccpRlBYx(}19M?b^;U|?Z^A&4+>F)$DpZ|t2%9FoP- z0xiaN4vgVTFZ)W~Jn)H8jzZhYWt*Q#K>h(`tPXPqwEP{8>!9Gg!ow@NPr=|uSFha^ zQlz?N?WQNZlli)Zg>`6Q_tCSgihr7{^taGMe~&!$51ao7CjT=+&|$v&|@#tRZ_0%0Tq zdAAUw3~xoRx0JBuht($PQd&{y>OOr1SQT2uvo08=yT{(5P$dc0CU#P4r*JIK*JHv) zJiA;=XW*#k!L~3&0jF@LLx0~-*eS^xRupEJtC)mGY54peA3Z^?kE7Cf!RdHmnSoU? ziTHfUL94~tz~PweMi>q8Tv$-cJ?*)@R&&2nbNhJdWOLJ`)A>tQ0-UCJx7?zNdxC_m z#0K(DyD*H7LTWiint1lvLyudy6Tm11%a2|q%a>UjVV6?$O|hsF=uHcdR#?D>l3j5k zS@^!FjrzNdqPE;d`C8a!){KKAioN|7G!HyHGCp#w&)JbMM9icfB46L5afs7ZNpE6) z)4?qu$tY77;|Qx9ES`c4spTJy6x`3*WDTT$iwevz7P$3euIl+CsJM32679k306*#H z_Zm?99d90Tc&aiPXtfo)gs)n>-`+H?idwn#C~~~0b4iTRU0PyIm})d%IG%fBtHPI< zOLobGQ;J35^{haXF*?bo0*d#}FB4Msw!&^lY)l6ZAD=8;qP|prBCK6KB2YQV;f@-7 zK(SZ6l(fMRFZ@yF<2JuadXz|m5LZt`T1N)A#7RMC!KzRave;%+%R5SKkkdw2ReFGX z0~)Vo?q)-@(R_4IAbpP7objN*(EE$_Q>~D$q_$j?Luo+K$`=!_g{b6}Qk--=gPZgm zq5S;#_tY;tX;}oRBq*RhBWpA4=Msz=EFAP-T`l@j_pD+Z+;;lWa(zC(C zFH~D$m2$*=5mH_>7!mSL|0=KU`#-Sj(F836d&=sK9{FC)P2mq zZIFN})2T;HkqfiFDtoNK8$5{%SG9Oz_oDYl5}Hm}ag~_+G$Ci=17G{lrLSMzTxYW# zh}a5gD=Q$qELt@9*m}UwyELn30=srcE&{@2CdN$DiJ8&uBtGl!AF7QtvP|f4au^HP zeSFm3>c^Lt?G^ZS@L{%?Re`}%yMy;s#8CH^om2f znJq~S%NhpNkrSeOpKind%B0PEc*jK*aL*6T0k~HZ^O5{C3T(KBliqWX%3*F4Vm0b&8QEm7JigZRWIgK5YumEaF|(Q3-&1up zxT3@?OtMRAnR{P;Mp$UZOBS6LI`8{V1up_0xtN}Y-U{yM`&z<=SNM&AdDq|tY!o3; zjVd&0rtPiv%rb_@nkciIPAO+okHl#5(Z^nEa%ok@VLy=9wR)qpLRjQ|f9)tYA^S~Z z7;US~_7Ll0bk4990B-trh!97S__le1ljQ3oxaX>uBX2uSrCrd1R(qc{9 z2OR^>QH6(J-mw_n{kGtFhJ{|^n8;Cis9G)O@bTIb%a%m5H#|?4HaNsH{m8?H92PsL zM}ilxinqwR8n0|Fp)t8wlh(2IRngy85q>MFiTkvS`NgfZqo7;E3`QUIPOdnctM$<; z+W&z1SS9Wf7<_27*=3H8fPMDE$E|298%o(yjond+AJc+0)jXB3rxeTft})AA z!tEQntD!!1Cia)?mNQTT36!sT>UN5~#kI{t$hT43vL@fxdW1T291xzAg|z!~&jogK z6w%vzDuUj`kGCxwH7HYlc!CFhkE2(rN29!@cJod7u2O^G`s7IQv~gdIpoX#aURv-t zgt=O9UlCU?Umz~Ly|tFca3=NPq+3TUA>W6qVHM8JWb|_Qak>DB((t=kQ3h|+ZN0PM z!%eozg-A6#3R4VY9-M$&3j55c=w}&65AW{LG#=}{BCnQWjAQ+fJoK)n@QKzluMeyd zYdyF$8eEmMYi8Se;V5L-<1&UU8QftOH0AFM$yUY5zOIaFRvLQWLi`zH77iTjb?%H8 ztXPHFO|r&VhqltvU~5a@iqq&p5S&_8dJhB*9q7@>F&A09HY&kOa8v(%bWBwxa?AHf zoJh9m=vEeVm65m0S1~l2C`_2&Tqd{AP^Du0z_)s}(5+xBz12WKs~*QqANGSohUs3J ze#%wrSW)W;W5czTdKQk#H91d;R{dnSM@){L=7*2$9lDhC5Sg2CbRMk+96WhwP))Q& zK$GR3vtBsd;eJ62RiO(9ItymgQS>z*aUJXSh5_ zJaO81wa~VTtzS@TJl%s8PT@FTJYVc(RXktPYMci=9il){z*{IhBiTmTMp+y^Te;G5 z*uYO=M-Q95Yc<()-j|)|wq8=;dM)tbEoB;`4~c}cp4Kax{H~nwg8uiFxKr);SKMwC zqMMoOy&od4%E_oHEO6Fe3#*B_tych^)4U4b@amW8hojxr+GA{wooD#ej~aG1zL?MKOAkSazOOyL0Mh?^}g z-DSC44iZj*jxaiM$Y*K08ylTYJlj;lf>wBEfbJg7b&3V2*q1%TkqcDHWLciPH!3`~ z-&z^r1?eT-q}L1KYRORw=cO~HJyBB9ERgEbuiV}Ud>X|#0N)D2vc*mVNat4GwLM$% zj#0mF%}g@=B6q|(hucDul^ z)L1{Yl>d&QXWbSKy+ne4Of1=uPk)9krBu1_B)!bk^b@ablGIBqoXSh;w;GafLzL$B z9;vTFh>NnL^;0QZmOp$edri`jf3tSEhYI3Nl_+(!y`YH{9Mm`VMFpNImJc-^cjcM2 z6L9FsU*X&qdV7y1-&DeI{431tNSpncD#M$gTKqJA)?170)iaN~p0KvY-Qm1*P4kU` zM;}=%Gpa~QSNqXu?px{Eh}!rcKr8c4EmU)_eaK&PsOO-9#U7(+{U^T)DdXe!f#*9&Zc`6;!gG8M&sg zGqOJ##StTubaJc#w>I~tWU>woQ_+kkhpL?cTz6MpKR+QzCzUbZ(7pvmGmC21B@9^t z;|cY=pxSKs+*QcUq4L0HxOjcgOCOuUh>+P6Hy|mosKb4v_419UEWKtjrLH3aX8`ZA z@#ahWe0zg!a}$evp3cknICLr5(={ZES?+5U5l)_C#{id%V8X}>ms0Sg5zo=rZFUsBy)WN=ZDb@azi3cJkgBEec2 zZ}H4H``OM+^OD6}hX}u59_rC`8RVjV!^#j2anfY*;b+OsZ1VWAq&*i|zU`VzFdF0@ zLn>9Y{hjfz#hG9<9j?kt;_`5!CVjSoU^@)9f*}VN%ykLpPuh-Y8OIf44B@Lo-=n9M zip+UA_;_#<=wGX}AZM?BEzWaDjiai{VF>o~0b_XOx&@ztog#OYQ*I4@8gLKb zoU(sqZZRp^z<&)!RE@h@fu8&dh$84pb@VTs#SG-o?74vCg;_hAJ}G%HZ@ZgB^!5A8Q-6b4{i%JJ@?VdLb;PN=|74Hl90`HSWtf-^mLa|RY$Q_`3GbC z2OO@Kva6EY+4C;`R`%LFBdSp`d#)~3%i*AH;FCL6xg_Hcikx5aXOlggoRU4;8r^#HjAjEc+5f6iU zKXhXTVx!O(9#Y`$|;Ww5ge~sS=eTV!EB;U2HRxyMrUdzR9t|o?o4t zr2Vak%J<;)YF2zaqA2gh*5jt3Jq><)bd%5pbkVHPCodAig0*qz>tZ@Q+l&b{yI5uP zc7(tEF#d!eadk60Yvy|{WO#n(nON7Xw{t0DAm={GpxHzox>5|YO!Iswo~5-%rp!1EZnH=)VY){>8c1nOv$4?CB@+qrMLkG(+;ld)Pg6a11ZnBX zt!yzgy$<2ZkrY?y{SwB{>ThKFEzPbx@W~;~o0tQ!xS1Cafp<&unrbAkRM}MC4wjMK z$8vDbQCjT&`Xl<(qG^}2=cG>{-h@bE9-`pmh<7uMFPl)@*UJh|o6#cQ^SS%VWzCQ~ zI+UqAnRt{upQi$uC_l;o_YLmF+{z@u(Uo&Jq=J;I=S{UQ^F%jv+FiHmk}F`u%`RY{ ztwEF24ICiOoLQahYRovK+&0O}auTc)xLs6PI5w}3xlTl)hKn{9yUJr?dMV(J(qbEX zRqz0X{g__qtdjS<-@43fq17gD@#pF_8W=5(>pY z6QqJtVt%A}BXfvYluDHok*?rC#P}dMpDt#dw@FCQ7f9&xCSG}(S1@I^Jf_7clQBDx zl}G*RZs22vXU0i)`EulhN_{=EyO`_VhiAX_lZhLeUs}I<{qEPhIHbm;X4~@<=;Avj ztfQPc+5VGs*B*^X6Z9qXz#fRE<=t1QzrCH%JvErV{ktX}y#Q^@rq=bawo$-*TiOyqIqb#Wpi zK6L>7QL!&apQpoUvBUk#aEc0|_Gp3AP0<^3K#Xc+hsr+0@hEF$xjPGuVWo+TNH(nQ z+2^_>eD3dVITDI?I%gyMGd;y|UDWDRUYm$;y^KUjmG6YB7>+6%$@iYOsUTOJ7ezjo zE4mY<->nO3I9ZRM6lZ*MCEHSqbbLEPQpPJ#N46=_p1`iYnNCjnju4e2n`4cl_J${I9j+gu6@(tEITD>rnCbr|}DC9?R)vHa!3ftz8} z5sX@~ALiTU5kj951~09d717aSR#G$$P;Y5j5H!1n?#i!D0%cYjZ`}ixeRA|f-4p0Cvw_JFvIui?!v6;3)6{jLQw+h z@4_B16~tKt%1B&(3kYF+PWIAOYO&Q2k16-m;4DT6)c98l^pDIh-l}7#O5fIHsK9CB z7_;qTrCOwoCm?-1zog#tW~|sD{^%e%-`iuObOCPgV0FnYJL_v!ZwZsi(+DPnreD^Eo#YCFiRH!1_**|GZr#7+IXU~ykCl5Zr3>s&a zxlvE%OnCaf1X6OJP}v!=+{13Bjz~YbYohFaEpxh;i6pre5>RI#p#^Ub6NvahUL_LR z2J!RBk6X^V&SzD3oly1-rcTX^hd*K7*30j8hnMdKX>UpzoXJ5p~ zFc^`-G9P%yVaW*Q?i_r8)!&1-DRLH08?H=3dIoCw**krmSb~b_8IxiwXO-L@y^@Be z-g{x$reK`Q1z0Ce&Ma@wg_dv@>yn6elH(yY| z@L@8(I(OQEvf6oOvXz6lm3c2K{^L|7LCk&qhtbqYpD`d(Ta}$+MPRrW($<* z#Fy%go`xg8Kr`E0ntb?XH}183?h!YrYvgIc&mV3sVrM#7#Mzh4CXd-J78APr&}w?O zs)LYP-^|9FanNytQ;#-NcpG;-=CX4EyJob?)YO;9yQ(Fj*-NSJf^DInr|KWNk`HzH z`3Vf0YZ>#zimX_a!(s)$-&D^d@XXK}i-Ax{^ayVe*v#KfeD zigAp8Cbiy`>2jyx)ti1eTsVwcnBtzC6wb*Rn}1$7i<`p+6b&e{cZWVR;D@37(0HM+k(r;VmWjTfkjU zU!G9Ab11KA`H;1e!%0=2QObY4PWV2Uny^u~+sPBfXrsKuju*5#GhGxbPa;@bU;9`N zJz6=NBuT0wf2vA7WIjW0@p145hs0}lcZ7t&6-^`QZ1*eI5gd<6FMTbhD#^WEj`q4o zBDu@Q?sauPCX&;5U_CyCA#q`chV7UUqEp@`?{5zmLlqOzRz z%FnIx5{TUS@O`r{z0#OLbU7+OPt;~%M7My_LeN5mpLhPw6jjf*Cy zg(jcz;fk0|6|_qX7LvB9X@+s5UPpI{JU=omqS5z?F;}aFOS7+DiDKfxEzRLVO4mNY z?WY>4W=QR6)FQg0TU#8-{%tdJ7)hqV-^!HljM}$($q;yRp)=<8lSi66Y@Sn(J6RZ? zPf&bOtypgG-B6fjuAmg!6WY96BX^j7U{$1OL{3}YZS}<*V#M5XY1d%j&5vT$oVEig zv!-EA5-sE=6Z7Jh=56&3otkUjk8rj{S~!}Ls%Qgx#4=}$rqv35I22b-=u^Jj8iSlT^esC_%LTu(0=cb$Hd_%Xt3#~kcXYfNUckfRmFnw zo~Z6Y(?flz=C=&(eNB3A%qMS$9q}wrH6pc{K83PL<&r-^bJhpY%$jY08;IWP%zUzt zya&A_^N;m##fOtLiPzt%UuJsPUG3?4sy|FNs(3W4-OMtr6Jf|>)f~k7q1KV8_fCqw z<|#z6W~caTdD!F*&YOLPM=G}o+nDJ1>v&4u4ztqobr8PDPd0ZiEwfp5GW4mT)-#^fbg z>8vhsvvjPKaZH8TNK*&4H9}NwghsL5VvB$!S4 z+IEFmGGYv4bRer9`4h5dKyYVtM@LZSlHue7Zwkwx5W%IeLORqEGV5N`NXMW^62#Eq zy7}nBV>xT3Kr<$c`&#_Nuf7GQQ801`H}?)A)ftZ8R8@@}X9p0)xiTkdc(R2jyI$t2 z#wsOZe0<{rKm$)CS^Ux|WTroM$8Lct)8Q$E{^3yA1P1nO$r6tk#e6{bVrUMXvCbEh z;j)^PmCTz8<<+6J*Xed^pJ6#5ranJ|&E#sG%(aF_iA+t(l_$p;W&y9uJd~J@rK`<) zhjYynBWVpeQw3V3nIkQ3lYV%FCq_key<5om#(^kZG{Qf7$(y+f>(*yhfB_(VY!*rY zH{Q})3pG+T>85&F(P%O7rPe)C6k(pfl4$K=5=u-yuetT^rTFLR`_+itMj-op0Oz20 za7VJg9ZwDAZz)w#P8j@WWDpc)2HOKAq+gGUTPJ&D>cz7{e_giHN4QCnWu} zDn79;)W`nOQH>|x`Vr5^R^47$y!i$`k6f?TkJqYZe~F=H&CyC;^crFDxD0P$dZ|wA z4ffmRHJFG}kzbUCdNG}ykd}okt`TBk&ysRyS}yyNc38MEI{OqqBR#!kUz_aXETK4i z?^O*~`(k-d5?zA|6NAT!@|u|b|1B*O((I_>TAfJgi)ldluH9ym^vh`t-zC$^#XqUU zf4x*cyEXRTZycj0NWj_rb7<5MATPa&q!7&_$NC>jNgR+6i-G_E{k}cvlzwL&T^9gk z#!n@7wGpUsr0DWS2dJ^eXL3OPP-jCURptdn2m*u0Bl(CPL9!Z*aNdu> zmi}LhJ6|PBcXK<(Y%XSz-CgaZs__aPfgcxRLqnMuW(ct6LomuLa!fR>QqpH}qUj30 zqp>Y@aYu3*rH3%=Yg&%kV`(S7Df2=90CG3T)==KGww4Iimkz)&lHyhXG6HH3PT5T7 z7@t=ryu^57``FZ?(@${>x(=CZ2vO;ydaO+V)(b;EIO=R#fi;~HnGBEVA@uYS7j0`a{wqk(tviy^BB)Uz9upj zYbbRYG^Eq*ZI}DxTnGx?mFgSE=U%sdp?qUtA7rU7>>+FghvP}fE$Da3e;p|c4YzT3{Yv%e~Ot` z%eEoENc>miy-7C#y+FKcUAa@}%6x2h$hy0S7cK4o)AVC#uOrDMNk!xqLfm%)p&L`_ zIm!tDEz%eg$#p69D7?LGYo#JW@}y}c+s_@kz@^l&tBM{%qiy@<`%Z5Zea_n#&=48` zwpgUPRd>22jMq?I`pr3snR&V^??N^w=if3pH|$C)Rf(sFrxnBN!EazAsM%d;HNHc)&bl zf}Cj5*yz4rmU+s0MK2Bi+y({wq88w|*NvyHj>A_eUbZJja)@#0>m+5h}f87sy zg^r!|$yudn)l!PptrQK&73zEDmU9q+{)p+^JEPa!>)`{ET=y!6OIe;ct?3{DkwO$9 zCvZ=QrbkVw88Jp=P>|yFdU$X7*U7SY3}?a4mE_XxinW?3^;)Hgsjm}GK+?N?*_RCP z$UP><>e&;;!|6QM>AG~5(9WUucTmy*6__n3Hr#dka*akTd1J#p<6!(_$v8~0l0xk} zL0dglZ|C?}i5Y~9BS!TjApN>`pvF00YzL(sn|txsf)QKh$@g|h9^*n zPY?`9SoPkA@6G3lV`po@N7Z2scdAFI`C|Q~;q~uMH=ZQq2t#ukp`!}Wg+GY>oHF`T z8sgc1E0N}afPU!Dx>VAI>soZ^GoOwq4Cf#oqv<~DbtfdRho!&&)bCe*deG&Cpc;kE zp+5notgKiAxEw=m@3wO}J0e*tij5v2&+6}R1ae0BOrOd!Hd-50)T6Mzzn*gO+cmwMYjCj1H^h%{4Hh+XQC0TLJw_R2+CPqLa^o|A5$9|# zQ}c$Ar%xS*j!v(w-H=)-IaLXP$Fzk!*W;QO(kv^lhla2Xv&mlGT zu|LcSeB-0RX{}%Da9yRuvO{mC+S(ZGA}ensqta%Ou_UJK>&d^HH&MYHaiH&eJ5|Fj z2t)xy{{TqPW#d!)%JNKhvO#gD>$coMmey-GvkD5?td?LJ~T!E#!Pei1^UkHkk*Jo5)rrx{~idO4Ep@t;pAgJwJb z0LOn*C$+x6mq56W%f(KuZ*eWL5-E?;krg=xNrYr=N^S8C*11-n46(wGJ9OA%!YH?W zVv?jcdZwRwDOraT4djw~Zy+h^2;-GPiV_Lz4rO$00@9ss{{T(WZ}ltfQf0KVlGer; zUQS=Ub@fP93ardP_>BSEFm*U(lo1~$8HW@ANt4b#RJVx_=_rvTq5kSn&BB%0qNzQp zn&H{`yM?;(h=kh1%^qKpZ>s6Kib*?va~iDjGnc8M_$u2TgQiC}W@O6=!d#>ber@=~ zp)MiOUixS>OL_HuV^xOU*4`r1JhG}ts-~xmL*pz@6;%t%pdE7yMcHxEV;FIAAJVxu zWyhN=xXArXTIXByo~vs;%rbw1^mmVxH@8-%?^KmY*zpV!15V!){{WYr9xVW^$^AdG z?@l>G5xNpSe@hGU9j}yoT$AD_ z(tFQy&}Hph(8n68Be({8ZRXui%9^YiUz*Le)|-0iYiZ^S7(S;oHxhzkTbN5SJaQ4k zkTebOy6(7g=!TjmaJ{>~8~j{sSt{yt;*L=eAa?X)F_@ zil`4oU`r?Z&Ec16H6u}u$3DLG)ag#2AP14$ALyfxn>@U3h1k_>gllzD{J>JBsrIQu z<6Nuqxp?lnx(*3l`M>|w?^>smZSH1K6EYB4iy$=k&f9eSGGV5XN6FglrL=!n)bC@C z6YxhIk|?33-vba9op!}qzZZU6(={!7QoXx-8yJ07hB>8KC3>nXYF)_W?#jN^#hfB# zAOjeV&+|vjmRA~`#;5gI=KzZfND^r6?b5VCCBbGSf$=v|cfm#M@M(qsB4i?c-+y{T z`D^4IPt1^N5?bo_wlPb8c4UIqQygW|W=>xU>_}A=#0H$$wB#A(1j~wDe9+&S-c`Et z%=WgInw|aXx7J=Xy1ANV5A{ijDy~Qdp4d&b3>YJi#KtI_AM8p=CEu9r)eo69Jw({f z-jsT($y-tzWe@NZ9^#w)KjmY^DpA>(F&fGb^`rFv0G-w^WAdlvf0r(FnLNh2l)A0NpW|F9IZq^G zMiJ_K{m$biF*rvVoyJn`?vK5e>VK8qcv}V3F8uGP-6eTQlB7?$r&cT5Gbh^GsKbwh zSH;%h(CKny;IsBTe?^ndu_L#aF7DnnfJv%aSV$tCaBi-CHDII?H~0@;*^~L-4o7|y zBhRPPAE`0X_<(K1Bh&c4seL~uruj3-x;N%cp}2oG>USn75Z-Chv`H*eM&ZK983QQ{ zwduVwnd>zK@JhG&AB!BAuw$v?vtMVvFHq7vnRln1TTFY&X45XK8zT}a%_ zV!AOz=^XLMlE&@?yQp+hz;DL5X`C`}NDI4y-2Qx6^{6i`ZLaj2dyDI>Da?&_infv&BQ%fG z=AiDLr?q)v#Op9e5QJ{QKXD1|m!5QQF4`X{d6w4R@>Ym7Ii5f=DIADG0i#e?`*4Qr z-J^<95{Z<41NE?-9{y_&HflEBRgzsJPqn>BH9Jk^v3Qu5cSBLYDh6hd757$Vz%7LJ z_$uHCJ=8cp{{Tzee3PwOL#8>jx70PCR#uqZM{Zz;mdnO5AqQXv=dLvCHJY)Wb_D<_ zmmf3Srv+~=>U+|Fh&%ZH^94A3O6%qsK;+sMp&0g9o3DMO_QsabmmXvVNg5WQYv0j` z?N0vy9yE?8km^6<56kU;So4RL^xv*|dt1FriFEtA+ulWcdm^JMP&&F98oajRKGwrD z`ke%)kYt3oWF4j*WJWWNV#67~^H!zi?>*=;+}hh(>l#h$uPuZ(OK~fPjHu)As0Wbg z{J$UB-!-!A%-~OcBQQL=xw!TCeG%M7B>D3c^jJSRG+!`jtzl>y*;yqGbAQIx-5NLa z$Y*m-MAw3jyibN4nmt^xa8UWRVauk5Q8Oc6<_r05%j8{BdyQRTytBE}*5F-OOqW*T zD6XbgW|2)4^KdC&)rUW4=9GZ|5D$M!AE{%j#lS}q2i@jZdCSb6QNEqL@#R5vq-(Zs z94)F^pyK|kaaiYtiu#Dh>0cZpL!5eeW5N8}<>wyc$5n>CQYKyeKkmE3H1c1ZwOhDt zHP1BNgpx;|7<9W7d8WB|nV}N};tIpFaj)Aw^EXY|^T(Hn%D`&Pt;H-n5rs(g^8K$v z9%{ESnFf)l`eCSF>Z}3(0At^L+|#JyfB)C_n!`=D+iK#62q+l0Q_#~DrkVm)l%ei= z*9z0hyz}{S1^m~u#cnPlzqniJAa#(cT$KUJv})yf@f^1H@HnuLKxluK_jdBfaExNP zjt{C@&B20NTS!aDw(B7;&B-;ALaeLss{Ym#dy{B?D)h@4V!5@Cl*!CGNxDlMipe54 z6aYH20zj{PHi{uCy8NuPS*<0sv}T^o3|6gkZY~T_5I_TqA~6;CS^dA2Mg~-vXkV2G zU;WETD6kG?duD3MaXY^^n&p%L?#H0}D753ac?VuS`)%512f)99Vm^n~TRPR5Wr# z%Oq?mL-4YLhS5(Ty8OPpU2f-7vb902PNYw$1$mq^as}gr1ztoIp<;@hSC6J}v83lg z{FJnc#wayIDULNF2wGlloR1=1g%r7BOArA4k+wFpSKa-tu9$Yh!LmZGnKP)R<(R~1t_ zrji^$*Vf`<0TG!{JsEieLTk9+6{KWlDHoJ%9YHI}O+{3YM&1Na;;1-vog!G4Xz!pA zvc|)cst_g|lA(wrkm+1gO1JurrkfOUT^6jaB8E88<&sGVEyYm-F*H)fgY1HFLddn9 zCT;;QAreRfEKcDi_>?dO8jKAMXhm^NH~L#jF&lw>ZeXoFUsX6%QoGij@j}RTeJ16& zMR^N7Swv;kT=8=m_(=wwg#qu1X&8kiMR?dWP6Hz;s+Bu}2-_4iBd5J_R=qP_@mDNl z6XDf|ckx;>(FQwb7!p(P7bT=b9vj zC5djMYED^bOofOwWA$L_^EMRfi|({AUUTe+o>%M5S_99BvsjUyHyaBfvq`vc)c>x$b`c>_i^ z4`pg(g`Ic_%NKN0KuVf|7y8({SBaEG6mZ6n#GxXMLLw-ls;Hm004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U# zX+uL$b5ch_AW20-HZeIiHZ3wPF#rHa$DNjUR8-d%htIutdZEoQ(iwV_E---fE+8EQ zQ5a?h7|H;{3{7l^s6a#!5dlSzpnw6Rp-8NVVj(D~U=K(TP+~BOsHkK{)=GSNdGF=r z_s6~8+Gp=`_t|@&wJrc8PaiHX1(pIJnJ3@}dN|Wpg-6h_{Qw4dfB~ieFj?uTzCrH6 zKqN0W7kawL3H*!R3;{^|zGdj?Pp5H0=h0sk8Wyh&7ga7GLtw0fuTQ>mB{3?=`JbBsZ3rr0E=h-EE#ca>7pWAnp#_0 z8k!lIeo?6Zy7)IG?(HJI3i#YJh}QRq?XUb&>HuKOifXg#4_nNB06Mk;Ab0-{o8}<^ zBt?B|zwyO+XySQ^7YI^qjEyrhGmW?$mXWxizw3WG{0)8aJtOgUzn6#Z%86wPlLT~e z-B>9}DMCIyJ(bDg&<+1Q#Q!+(uk%&0*raG}W_n!s*`>t?_ z_>spaFD&Aut10z!o?HH?RWufnX30)&drY z2g!gBGC?lb3<^LI*ah~2N>BspK_h4ZCqM@{4K9Go;5xVo?tlki1dM~{UdPU)xj{ZqAQTQoLvauf5<ZgZNI6o6v>;tbFLDbRL8g&+C=7~%qN5B^wkS_j z2#SSDLv276qbgBHQSGQ6)GgE~Y6kTQO-3uB4bV1dFZ3#O96A$SfG$Tjpxe-w(09<| z=rSYbRd;g|%>I!rO<0Hzgl9y5R$!^~o_Sb3}g)(-23Wnu-`0_=Y5G3+_) zAa)%47DvRX;>>XFxCk5%mxn9IHQ~!?W?(_!4|Qz6*Z?KaQU# zNE37jc7$L;0%0?ug3v;^M0iMeMI;i{iPppbBA2*{SV25ayh0o$z9Y$y^hqwHNRp7W zlXQf1o^+4&icBVJlO4$sWC3|6xsiO4{FwY!f+Arg;U&SA*eFpY(JnD4@j?SR-`K0DzX#{6;CMMSAv!Fl>(L4DIHeoQ<_y)QT9+y zRo<_BQF&U0rsAlQpi-uCR%J?+qH3?oRV`CJr}~U8OLw9t(JSaZ^cgiJHBU96TCG~Y z+Pu1sdWd?SdaL>)4T1(kBUYnKqg!J}Q&rPfGgq@&^S%~di=h>-wNI;8Yff87J4}0< zc8B()j+~B{PL58q&O=?Yu7hrxZk_IJJ&YbhFH!G+-c5a2-$FlLze@jx0c>Dtz%@8v zFt8N8)OsmzY2DIcLz1DBVTNI|;iwVK$j2zpsKe-mv8Hi^@owW@<4-0QCP^msCJ#(y zOjnrZnRc1}YNl_-GOIGXZB90KH{WR9Y5sDV!7|RWgUjw(P%L~cwpnyre6+N(HrY-t*ICY4UcY?I zPTh`aS8F$7Pq&Y@KV(1Rpyt4IsB?JYsNu+VY;c@#(sN31I_C7k*~FRe+~z#zV&k&j z<-9B6>fu`G+V3Xg7UEXv_SjwBJ8G6!a$8Ik+VFL5OaMFr+(FGBh%@F?24>HLNsjWR>x%^{cLjD}-~y zJ0q|Wp%D!cv#Z@!?_E6}X%SfvIkZM+P1c&LYZcZetvwSZ8O4k`8I6t(i*Abk!1QC* zF=u1EVya_iST3x6tmkY;b{Tt$W5+4wOvKv7mc~xT*~RUNn~HacFOQ$*x^OGGFB3cy zY7*uW{SuEPE+mB|wI<_|qmxhZWO#|Zo)ndotdxONgVci5ku;mMy=gOiZ+=5Ml)fgt zQ$Q8{O!WzMgPUHd;&##i2{ za;|EvR;u1nJ$Hb8VDO;h!Im23nxdNbhq#CC)_T;o*J;<4AI2QcIQ+Cew7&Oi#@CGv z3JpaKACK^kj2sO-+S6#&*x01hRMHGL3!A5oMIO8Pjq5j^Eru<%t+dvnoA$ zo+&v?IGcZV;atwS+4HIAr!T}^80(JeesFQs#oIjrJ^h!wFI~Cpe)(drQ}4Mec2`bc zwYhrg8sl2Wb<6AReHMLfKUnZUby9Y>+)@{+t=@` zyfZKqGIV!1a(Lt}`|jkuqXC)@%*Rcr{xo>6OEH*lc%TLr*1x5{cQYs>ht;Of}f>-u708W;=5lQ zf9ac9H8cK_|8n8i;#cyoj=Wy>x_j1t_VJtKH}i9aZ{^<}eaCp$`#$Xb#C+xl?1zev zdLO$!d4GDiki4+)8~23s`#QM3Qvd(}2XskIMF-pg778yJn%Y8q0000WbVXQnLvm$d zbZKvHRB3Hx05UKzIXW;kIx;jMF)}(bI65#jJXGUF0000cbVXQnQ*UN;cVTj606}DL zVr3vuXm50Hb7*gHAVX6%AWdOoX>N3Hb7(7)CHw#Y010O3MOL_t(|Uex^ucwFaoEeua?lAFZ$eu=->jvaT&vbto+maB@@dlxB@ zl1PeGtYYuIgQx@ufatw9TkKq#k ziGK;HnABl|D-_5={L_~-DC-hn8+rT>c8e<=thQv+u5@N;w%VIpiXd5o3>Sj2@qT;UfL zxFRm`f4ZcIyqFhtiLS^?iYQzc|Dy{(KtF>Ee~bTm9$xT2!59B>STKGq{}cGv>Cs^` zl@MKSo&N=J{jUHaA;+f1zL8*K-zZ^ro^B}JV!q>%mjzTnC@=a_UNn%qsEoR#jJnKU z=|z6ze|RbBuhVaE{xE(O{RRd99y|wt7XJjH%m1PTC%+k3zg)OqwobfT`bxO|A2!Xu z214;(g^QD(L=i2-ADxi{pG~}`5BZ;cJOLYrG`>MFDapvlJ;E#^>2?>!xv3L9ielZA z5@4791ShxrNa<2Wy5;=`7ygs$$DA*g;VnG}cqRm>WUOSez%m>cnQ4C1rF=XD5s0aT z<&v}gKj&lrVhGtj3ZpM+65UIaJ@v_+syH{c4?KzV{o+_R@kmNPmf&8R;;D+ifvzqu1~B-# zj4MCN4Y#!*%1xK#ZAkO2$ne!C`|vlHUzatBUghb273qGZ$v!1z z^CKdRl?*gL`m#F7Q-R%DfApc?r8K>i4tb5{# zU;pgh2k*Z3fp_0{2_HroaiK8g^7#XsK3n}xNvs8kK zqOUkHbHi=TkH*(4`7u`tV%!x`Zg0Hu!u=0D`jemC_s$zH>r?%dG48HQm*RVH$GRWg zb?;B_x&N7`pFDr~^O6KFWwbm02L2_{aK!|<^jI*c!csK}p0LFa-+k@A2Oj>z?|=8$ zFMs)+AKd-$qrW(JU^5y1%yCC9e*Y0^1cTidK90;lI08h@XfLm z&tE<9#B+aqTASn{+^i=4O7P`WPX>KcIz6NtZhSAPi!pt030Hl5>6kwl%o9 zkN)CuV^#og75}v`&Z8*K<7f9h_{0-WJowNfRf=F$qPOcWD)Ct0lJLgwcT)n?s4D`_ z(i9)JquYOc_q{=v_8T+(V0`82z6H^jUwH26eOo^*iFao=%ZV}9E%X7&!8(J>9npj% z%ktpjib}5Nb4P^w&%zKtAAcQ$%E$|;0VnT!@R7$K|0R4W9y*w&_o%U*R_K+3>XD(-y{DDUNaDPkX5(-XqBE01SHP##Oi}g|Td2?9GZ| z-L;8c@O#B^9tE-PFc+B4CoA8ECE>oSlDswWlP=_9+yPZVj7NTqhauhnwU?fM>d8Oc zd;i0!LFbF(z4Bu{a8+alzW&Pdd$+E6_>o_{`qFb{8P~+m<12tyC;8wv7bkcv0~O{= zpyD6$JhAIvzxU%L|5JEBlr*t*YLmRSum32@>u6ytCr8ovIG%9k%7}~j?06Ohkhop= z;Hr4HLUu)>`YeufD~WR}in)v{KZs7rLm>%thfoUrqst$J_mM{ft5-+OZR zhT?d4eC)WZ$2NWP{sRv`y780uPww65cXkhugXb(uy&CCtbls|Vwygay+~bHk$vevX z7$7{gZ?itt*N}1T%z-UCHhiQ_xytZ(<^$$9&w@CwqIj>8WFPp_ZRzQ>XfVdKL2#hhwnyt9|wvADjtYf zVY{BNPPpX{-hQn-^BUVdnI3lsd^{{p$A;e2?cx zUeqRfCitD$@bP;efA9uet}21j0wf2UKmB0iC+{8G_1VeY>pf3wFNnDet2n-Uedv_~ zxNqL4cI@7~3P1LjhtM*9Pk-_DYcD4H9zVEk?T_xh@1ytLC{6JWb3b%q_xe{~dLE(csCDSi^q^gs1w}Zf9sX+{_t*CWQf~=2Op+b z9)9H@9)iCR#lI55uyY7_&ph=9+@l2FV-;!Mk39Mq3_sHI(0va)^6Ov!TA$*nOY;2P z?|z#Zd{!Ore&NvP-~Pc*HA!BYB+qN-_uTdK2i%TsD~`vL?qh>zz1$xv*Kqze;_Z$W9O#TwMCJ4|NMb>-hA1> z@GM=4-lggOpMLaCl+Ou#^Pc-~D;_iF2A5?8?%wk0iM^X_1>vv0_&gwt^f{qU_63T* z=lB2XcYl-`a?zR}26XR#@R15U7WkcbCg`hIc~;>44?c`5HRv4qWHwM(KfEr!YLl<( zQm@J*FP+%4VgJ@OK>GZ_&AT_RUjOm?l{xzbqB{DwCiV{edg)XByU}k7cz+V-g;S|f?VI{gLhuT z-OmU{%6bKtHre~Gd+rBdKn@Q$0@ArdpCfAsxOhO7DLMq>0TEldKV@56ejqXazh{e#bf2!!Ig^8U;p|yxTk5s zmx_~oAA9VVm5MNnA`GbBbKe81WIueI!IPul*zlo&g%F(U( zcvnyFLU@4L;mw`dw+UFL1e|{8;YV?cD>D3$!NcYv0LIVnKe&Az9%nq@rRmq+e&gl4 ze||qaSaBj8BLkD@4F`z(`1AW8#O*7~4A{4AE$&Ww=w(&1Z*d}DNw}`6Q~VS$o~UGu z^5F8Ep!J`ufWP%QyYJ-}o=pk9pwA3Y#(Mqyz6T%w<*)D@AOvQFUdF%m-dnHk+q&+( zH($XoEX{yfUoE1`2Y{6%U(E=+#1KA==c6dm2X9H3W~9$?Jd1G72+W1C9_1PSaPJR3 z{0pRA2%@S4&kF~);MqlVz-#0<+GIS+55aZmlf2*_vqH}O;HN)7vSTf>3RGO@4{SzG zhj@h7FiJ#6Bo-*X{}S-T&-}FzBB8pnef@_>?OuE7IXq2Bt|*U+bvu7(3w+U<58wXn zZ+}~s<^vzHb=`+ZYGQnj0X78r7oL5F^8$a^95TJ*yEouQT)%V>Zml@M8%_+B1Ma(7 z5hCnBmEx;T@l6dr53~FHvyTi}L5ONEzwq3nk3C*p5TQ=>D@pdnjpnburI~@J4s1QJ zV|`g>P-#Yx*Xg~mIXL#UtKPTdhU?P<11=xA_x=apee+e5JhU|9y4#5_V3GT`tux9) z3^~ENi~vpAwUVT(xQY|SMZfc&dmjW=5#A?&x_DQ30egi*{&?lvhD?9tL9MB+jEa);+@G2p;9VTRu@Gy5l=YWbpJ{JGTdkOj(N8i_bqp z_TY8^o)er2qA4O2v3-9rQSetn7=9j+@6h%&K=O=k_9^l&1N?`2a$F`Zal^8}5-MH{_v*e*p+9 z^Fnm#{xGJi=l2&T_+CD~>!%3s-Y1Yo8nUn7^|Sjv`}l+WIG==o^O}?ZRg!;6lD{h1 zzbY^CjaOcbyLJxvsZ#?A;(hPA_kjl(vs39xl(9Vs3 z$Nl7<%DhNZPFQ-V+jX}i+SGuOWbtJ97AIe=$O*<1aQ_1jzw*-aw)_adj0kE`gzVh( z$y0mMml&hg0NAQrH-oHhY_wL!U z8u>JL4{%*V4)%-3AOG=P_kni8d(|gF~#H}YaV%d-RF){wTm_x5XN4sLtz%~vlR+hNTQfA6i=zVm~hR%8e3(gS0B&%%p7 z@X*7%x2!463NA?wP^AQ@lLOQ#{!xBs{_Xoe@jA0l9__733$ztPUr;5LZdkHC6I8L{@}h zMCjlA<~Iny7mn=MyKU`#4?gtt(@(;k!kO#S{ox^yPoi$Y=R&OlkAf-)xePLtc)wF8 z_iY9(p$NYusKJt0cT`qCy8GT2pL=H4##R33_8*b^cg{h>`?esqdZ)j ze!U>U@5t`WFgVZC`!62*;>5nKW!WJ{MRP`y@!u*_TaYscyDuVs5<2uqNX;@@6`S+o~L(n9*cO1BF78g40S)U z@zW1J{qSv%6FU(*a1%iH2<`$z>$!tlK3nx}!nG5)OWFj_Q+qb7U-fQ;=OHc!|7xQ3 zuZ57CERh$fX&`!d#AkxP2NQM~ejj`aUJDKkISZ0+diSv&_+S997)b#tIRuqN3M%>x zI4<8J1Rf4TB`LmTnb!^3!TOBrbO*@}{9zn`1UDBK%&S};rpX9Wr2#xZNEiI1HZ91I z6K2Q>FUtwjWrnEI@B=|*IpON`AXR#hCL`D&$A1bhlZPARVfYz!+I9S=vg}Z!A_5i( zm^G=_@vDGkNooMTO26ERs4hLokQH2!9a5eZ!Vl9mxLJytNmudawWh zRpJxyd3CA2sFws$zy#hEB&%eL@gCrMKzbk<#0|uKLjhJ0b(tF4qJedXA^sRgJ|mg86WF}FbwS6 zMWng-Ayg!w?0}QhDhfN7A4#vdbM5R3aWjZLgY<6b$x8OYLx-$CO3{r?bJIthv(PzWX zB8_>`rP*QD!gzgFxHdENPcQs1F8Y23{Z}X6OVEnn&u|8bXGOdLycumq5F)EC{kr67 zogotsp8yht4PpTTq{|{vhrscuVT(yrIKdpj;YkE<6pCXv4Il@uXrF2dJcKR&HV@PPBAh9?_eVKg!NqV-df;Bn>nPI!Nm3ZN&l!!Bu3eLYX@-tfr^)Zq9? z0F2Bo!AF(kr%IvcSCxV!{u=%3XTo_# zmS#ubFXqMjXGZ$qg&u#DN9eM`bXlSJPk4dfOrU0l0)B!vJrv)>ze|Xw1?e+_^WuEy zJ@}nPD21g;9)h1aJbBu*fRvz%o7b*P3OuJyMwq+`X9GBMBCde*yL5C1a#z&50T=df z_~d=iI^?3FuYC0G>(?(GK)sJv7itXZwIRcZyr`5!A?K6*Pk^FBKknrhpGEP_BCd0a zi1XmYT_^%VGF5yFKT0KCidV?x{hlYcm&76bUI66-f9-X0=c@PL&?S1IQyO#iC~{6+ zl24rP@$AqGMd+QzTtQXqd2$!3d$as{M##mx?zzt_4?%T>v<0zU9_5}H?v@|xg-Qz+ znH%j{mKm&w#vg;_G2oiXYvCD3kV_7_Ovy!VcwU@ug(509))%+6vLH4m`YIAUynqcE z716#IkDz97s8el42_L@q)^mS+rcRSqnjL9W#MG)&K*!*#wKyp`#G^tHQ&p6h5OhVA z9#W%DdH%US79?Lc=EVZkgzIjW{5Vry4B$8C$K}Oe1GLtngyayn^4zGZg1Gp=%S9A|&82C!qL|og=X9CD+RUKhWPc>a*^wSVv@A2^{s$jw(j|b1G3JKgk;TKB z6M5z1m2cULqmr+m$8(GT8R2~#EF%a36p^4cet6ft#>{K#1TT1oqqjvv^RBXmzVbBWWjCTb z_z=jw^1`zh4{wRPdK87~t_`cs?%#xl!)MW%^AtBqfaoxu&+)nHba69(a>n~rua0J*im8O64;rp49-oO9d?`_42 zunc2f%+(7=|M<+)#i=2ePVV&rr?76dDkBWVMqx^DX4KVHE8eZsrQ=ua-ul^fk5gZK z{#kac?}g)g3X-ma9=dp9Z&tML_D!Ge-?8!Fu1&#SXYp_OUOe{Pv(MCN)7Gy3;EOHm zu3tH^YsSV9zkxfA^*I906J!dASKLHhq9# zF#Jp=8KNgj^*3L85v7tg^;$-l8w$iGZR``j{&kBs9z?c76@&V(z9jzq;T`+7e^#$a zymsmE`6D~`?^y4CaxYRulQQa+7oV@ljlyjLNU{DGKU=*b;_BJ+M|X#Mo!-BFV^XmD zhEG4NEKJbnM3yUJJkB0Ews+gcH6KO$Up%mL)A{3j+RSnkdF>|onZvt$E*$YVb8!2{ zPtP6QU9ZphV0+}bGAXBtbFI<(Vdimr~9L27IftZs@}5) zw+37~u=;~Ht%_hYdF%zDpt?Zl9Q$JZ`GZ@&*t9y#;}C-7t1muRn|B@ba?qu{pRRZl z_7`w*4{qk3&8t}>aVLZbd+)ySGV~K@f1oXi5*o=1-fO7a!Ka@3L)!Jz=nLjXT#E5N z9(VP`3(x%#nadlmzEGCthnm484?@w6lnfjS#1^T+7vufU;ud5@TmcOq;(q-1zx$mk z#UBN1W`w&jHyj2BEK%L7(}LhCtwr%a`}zGb{ue-r6(t33T=QXai2Ldf-no2Y@BW<| z_ikH%WY6boSFbQB<4yT-ewUBsCHkj?dEyTC+VbHWQ^UP8B7Oh(^ivgiaVy?^^UCRi zTh@OZ;&oOY7XZ7A4|0zQxP1QD-eAu&@4fwoDn0zM#~-&AC$D_>Ej$pL)~-qm^IE;) zohzpgY+1h=)Lc%iUw+c{*nrDXeiu(1*bc7?Hw#10jPSm2Z1=wH8}L5&Z{J|fkHx#S z6~-Z0B8PH2u^UC_iuc|~47^~JhgRf-R_8~7ZLi7;2M>TdgHl8u<#GP-w({)jKfdc; zTYfnDnum9-htdEnl|>#1Hs6x%j~j&sI7~VA>M{2dJKlNyrOcqSaL!e7{|6raMQY&5 zGy6BfQ$F|1(-a!N1|gzoz=gfpNOdC4=SE!gIKCbEi}%T0sM)Wc`2s~Kob|~)8=zo7 zR{^fz^3md8glv6{@6e_I8s1Wtxk*dyI3lZ(aWRH9Nw*$$CT&AojI~6 z!tbJ8o1sh&3h_RNpUF=OI=+90K@nS3oD%ML!BUhMe)WPrCrXUZB~RKH|q4E zongLb5l~BWB5O6Nuf6gjUL)3?J^V$a?|Ex+f+E&0IphkGAd%LZkcu4N9UpKWg(jCG zl${kO`5oM`0p$k>SX{8bYZnfJK1>U~m>=&2)ATyMTa)4oiVkTYYG|YsM9U?6yC2_) zv;(~XpEJ7q+YSwY&*_~9w|$Bit^#AJE<~yW6oDUCeiw_P(fhbq5C`2K zln_+P6h}xnsF9=vmLy-(XA)_t&kRPM z0{oC+>a)VoSh{-QaN>10XIdDBc!MmlLJ^IxaFu29XrnULpoj)+6?w50ia1zUS#E4u zZj8Aw(U>0(Y>fE{Mr8tEFc&7_wYf04Tp4dE!s|q1K~hyoYDIoxMSen6Ns6T?xk8y> zDoC^xrIah-fz;*HVxOqsQAY<;MnloxXTtk2ycS zG$)GQRc^E{Gn`XgWW2~}sY*fGY>-Ew>_J8?N)Z5wGza;PIweprc0dsd;p80XsZ2DAQZ%0%7vLZE5$oYdn)J8 zv!3Sy=_gV7Ny=IP=_cCNQlT2_A$S&1^KrpP1i#ceNTPxPo)ec~J?JAbCxQnSpZwyn z-D%+-h%re0aXaYB4%cT#;vSXCBg=9lOLL=e`^x0NGNw!cEOEur%~i$$1H7onO9U#o z`xQ#OAgG)dAY8gC@{`2n{3d=9e-uBDuk?4zoxi6%kA9&ckAA-Z(vTaAN5}iz(P~w4 z8QxNEWSN}aB;KlyN)cd&`UJIRIDllj01SgvhXB74)E>+X(5;|4@|q|jiPlN*75z@S zhup?OmrXDLLK`5&SETcZbR#{csQuAU{1ctrGAmrd?>y<%q2UxNO=4b_<41}W@SH;N zAjk-mL0qcitDnTMNW==W8~7yr*~EoU3u`OQi6G>%B5*GVxg6;RmE{7tXjmJ=7AxIQ zHW6GBW_0T%V3r}2Y|KwK7Pzh?*y5d+^FQIo=#p@iV5aAQp9cC@2ungVkIda%n1FYJ zx5STBG#;-~!ZHe>R0k~a5wZxvJAq`{2wV@IV4?$=uOQZt%u%3-h*OwIgpOnhOy#gH zOPC6Dbpk~qPoVHq;490KbC@i133Oc$GLa+L0RT>7PGW$NeA45s@a3Z=)EJ~q|Yh(Nd(^mMz-j$n%|XPYB~Bjge!Q&YN( zDVYq5(K0zNxI}Y7lDQCm_0L|(%f6qCpLG327wQ$upcVgOIldB#;v&0*OK<{-=S%>} zMhO%%;Yi4@3X2rxNY5_YA_YiptpGv-Qna)rW==v;5OROU7MY6UkpXs)BwH1lRcA&@ zV<-}SsPQHHBP}!AACa@sM0nBz;v_tU2Oz2pJSWjhWPEf9;}bMAdCp+)kZgIORA4D0 z0UHv8io6&yJNB8l3+1`7wvtqMt#W`zPE1%E`#L2e-!k9GfK?Wy)Mzp*i_;MQOob_U zQKQYOD#;-+(Qj+c{l~>}23sdoT8P`<&9&-UOre7`)bs4wtx{_Uz zY2xj%dmy8P!w}AcfP_Wjb8%eY0GTBbc+A)ljb4&QIS!elAm^wzNjFeXITEvq)<5V; z+-(kxxcTVZIYr5rdDh3}QK85s6lFX{1pDK*5hg;&e}b=L5*Bi4r~QHAWBX$Q*GW~A zHz54zu@dyAlZ=KH5-}ziXLy*RlaAum41z7+j^!Fc%Z3W(jp53M>Vv^lu^e!IM#~&aBmD zy7p zf&^=EicOVbDNIDhug;95M6o25%&RE1-BS4DyMBh7WhqLvsWWPI*)Sb48r<&U)V9i^ zU;N^+qx*K$m*uuv3O9fD$@hNn<4&8Zp*+v7mse|Z9A%1XZFZBfz+Re*tD!<^FO}Dq z=i%zGsvdaoA^fdoQ@&N5QEyP-KLK6*T|(3eDxM7db2~P#J9ljFnpG=GGNY=sS$MH$ z+s2jey?yfFF5k;1@LxBtTfJ@Lr~7tnLZJ!p)_t-PPW6c=eie89iUD@Xwz%9JDLRT| zH6@Vfa;Z5(mO!DAMLI%1M^2S&(b=d%baZ7mAjGBY1}MS`sdGf~>Rhz_#4HHeAK@o8 zjPQ%de~QeLv|{8xS+qhaR+40V!u~kzlbk_dodHaSEQR6M+>Y(vvF_uKaJzA@ zt*Q)TVal$p>tA^O+0GhGbbyE3nIkVe|6F}V{<=?AUH7>lPYOACcy~!w%=_=YbgVXJ^l1kHf_%4^`BliexRpT^ZKhV1MDg`Vwi73 zMc!RMyB9XvU{DmMMm+xbn~k~u_Prmq7;}9t z9F6wBRIN__>Cf(MD9vyMNRjEVIZ{UqY=#Dj0>>KMG~vLUPL)v&}GJ zp-Y4A0h~^t`zctSxgaqu;_53ey#V~Is^?)~pi#Gd05Rvrj+jsnGxc z)aLMeAAk6MV}-I(l~G%o>vi!20Q>g$e$ZqtJb7rhzx&zsYgTtvYd%`>Zb4e)=Ns0B z`?+;k)xUn?iJ0qNrs8yfw`=Q${M5)7UwE!4Ga61?r$~J8p@+L`G`^Ql9Xqf~pO=J( z0KctLl}Z1EUVh!{+&gc*)?zBCQfKPq@ps>IFJ1#q5U^4HZdO%#vr!2GGs^$+{+*lB zqkJ9utTn4w)af&lLOfr4`9)Cb;0F-zowWx$RVp6|NL5-en#|l#Tjo?bG>U!>3FcfK z$7Qxi9#tAOq3lL9rvRbo+%Dm_yLhNH@w!7 zz1y$3pXsgDJp0FIa8KWU^R?^V7i!BC7IkJ_dEV*6yZh_(Z-ViB;ko|0vQ6tgxpd~p zaFg*Dk3HUCD#Sn3UagTQg}w6fi`{m8SB>teC!cJ#lz3e{dH%#9d_B5+$HD_wsx$3|ytBvlZ{4)EwX&$$RB-ZIXiRVwDu>SEbGQ_IJOpOpW}>Pk$y)3O~4e`^iIl8qFo`R?YnnJXDY# zwRO{Hef5TCo_@+yk_i;wefxELg>uK1^=m)*=-s#9G?!!^-n--ciGy{9yc%sbo*OvN zxDcO^tC!w-{WZKLt2z_$@*DsBtqyBRl`1nW>e_FA^P2&?X4Bf$pRfNkIo!wJ?Nn2_ z{N1-+-@kKnR*WBFWMyFza}<#xU!{9Ow}s77Dmkcdq#S}093fiZ+Fz86LgXO2|2)BS zN7YZ}NF9F}PlZV%MNZ8GQY5vMoea0kf|i2N}b(gE-uWBRi;Lz#{|_IizT_e$BCn=J`o;%)eI zKg1kti;_omRvJs(4V)@f@G>FdAQXAbj`=fzpGz=-;(f{fkVjEY3?Tv}L#$q*u6ia# zY>=NE{378!xLP8H3?&q34k`wy>Y@q{RRQu$q@DOC<@CkK^{F;Mo?=7#uF8bB#0#4y z%cjY$*5iie)aVsfo!q9UtEM#1Zpg3ED{D%X0HD^8@2DumRb8gEmlxEQ($|_YWvzj} zwp3|$ZQbN^`7~bOkGOy${v!SseoQ4#^1gh^-}6F2MofNMRCz&qZJE-h&&9uD)#uoB z$Y%4Z^|>&8yqPLZrd5}1)8$yTS$MbbA65<3FsMOMt2p#IC`C{L;iI7%;SZZAib&8p zrNlQm2_0}6L;^^h9PS?25Aey94^mHYSN(g>Kf%yG49WI5y(xwMyIrL8GEoE8h zP0~YVQDxBEMh44u2tA8T5fCi^asW&$@jIaC=njC>0g94S&4yEzJgUUwz!tgKK+)VifSF*R+wG2 z3pN25z$h=Un^g{5Xq_?CYmq2flpEffCi8=&8GE0yq$N{2w zm{F2YWKM?&otzlKuX1PvibRpSR9FHMQ;k@1LZ-HFAbiD36%6Z!2^DH z*ay?SkHiN@jYB#Cu6-BU4vOm{F zj|JN(!-;>F{&gpo0!S;~B(P+oghiTRjtnHs(Ok^j9zNz0ODAkmm?QD426n0)n+4!W1FEB5pljIf&*MCgD5Ps}G zoyFf0ejNPJ;fq6iL2%RbBoeF1>@#^Ad`JQh!2@Q8r?`sTrT~v0b2u(tuDE4n2f|ef zVymdni?^QNk^jo~0{>rGz(32p|4A0~eVOmS%6z^h^ZDFu3S5Yi z%XI?jGD>>35GnCi2}oEZy?^0F0HpA%^hurO2;T!j02C`y8_{(s733;VlnWHUR%~!w zTu#FA^bd_(QC{iAohecBQ-TVoDwC=WL_ufFlu}UUKLsJn`KJ{BkiW19lkAU^&xlgt zKPd!)@Ff39jUn`1CFe=3qp6Sr2Kea8Vi+HT2e*k!n~n7EYvAF*M^-|&kB}>I*bI%; z<#uJFHQ;>3-d8kho=E?VEc3a)i}}TWOL+2culT$sF!52D}06jtE~8=U)rNR>XU+6a*`SjRVyFN zf9qSSwZG3_@$H<~|1seYe{=nNvf%qz5$qDF5MfDhGM4mi2}og)x%3n=kRr`t6e&8g zIZ94dghuLkP~S>)AB9Ja#%*LDWki?@;b(#KPbObL+KQIgviQfv13zC)j!O6=^wM-{HL^+WGTP+Senb}ZLs`MwKeHZNTOWC~$)ZJwb(qz4X0-!Y zN=CWlV97BEi$s_dxvQu^v~q9@s69|YnkYJ=n;|(>%2W%;77jX;wq^f{CXHi|H-kzUQy7x8t>oWQK|Cs%T zEax3r_PesIcV!vx%JQ~-U-8*DHOGGkz)B80QGVqkTjY_JyiiBdx$?^|Ymfawcl=4! zf%`Rwe^<2ovHZ_}R&x9)^_e#{=iky^`k?sS8wCe{FW-7k`lsK?{`{V#kN?r{e)77< zWU{CS|6aZJmldDC(U=k4SW{64EKLAX1uTV8IymQjcS9;0*IJpw`M`8tmA5{(o>^u?txJ4)MgY)Fl3eT)aTe!$`hCRMD zsOpO9D^#Wnn^hnGO!3}-mw)(=xgY+ce5FjWQdYR_uA=?F&);!Z;l5v%UV5|a{EOA0 zU)UoKRR?_T2;bL|ex*6x9WNSFJ!&HkSp&A4J=atQY^jMpX1w~DE#`1-@&!kxk0aB& zI^~Kv`cOsaZbQ&Ewfow_ORq+L@V%=)lX-nl7I3#L@6CU)pIqM<=-y~7sfQaktLp(I z%n?{h-nE$gsuM^~c{pvRkAvESm>ml6s5&$h@&I%|i@zllix6@Qnv3J}Va z8~#;wvR2xYCV07>S^ z$ttl+f&?HGk=-E2K|)SdBbCS^O?72AsKi{A22w>A11FUkT=EMNbvgIOl_Ejt92j%5 zFcd!}zYVr87UYPnX(T65Uf2-lI$D)+TgoGF~9vA#e3f=S@nm8{M5!; zW1~giXdxi$r2wgRfJ`8ZMB*x$<8l<)sS>Fqavb;`i<#KR4%=NHd$KL@Oh<-SS6*P3GNh{@ zv{x0?r%UKlCjh*TEYE&T{D?Jw#HJjqQVvw+_FLqA=Is6|MUOGFQytf-P3+Vqx2qHC z-_jrM{mj_TFE7;iV$C_cK2I_v|%4&3xhS%lCZHV$n6&${MPGA}(D$fV9B1 zQh_ELiafCx7YJVz@g)Op2b=e{tB8kDMIrX*9lqQl-ccGXF*@G^DLaUO@^-A&|0APC+H{gi|dj@ME1B)Lrb>IsQq-1L7YgpCCL% z8gQb_=H3e*} zjyhEC@m_`7o7RwB>U|HZw*Rmx;Y4$)TXVvRo`TSRZG5jf3b6I5WBXJQJ*w!o)JxrY z*9T3R6AsmAZ4s^!n_|>aJX~EkR8!bnp3!4S>ocVHlxK8m6I$~_>oUBmBKDSgtkhgt zk-PWdf)jsGxqT$x`Ec>6mCBEPQ6F-pxvsL&TG~*h1CR|)i=-Io%vvRLtdP+751 zjyA*`>?w&DGUfE^5=P9~LltR5hO}N)bWdUUU}@5*HE*&(J=Lh2Y|>5C>*z(jdb~k5 zUZ)wh=Jgx12TVCbRRzPgqCvBwuOg>K9#j>+yVUdJ{3B22?frGJ*Xn{3FXf+jMen&q zwdwbr^|q#(@+Qy=Rx-ziN;1cWO05WxBGX|)K;m8L1Hup`T8^D6p(s2m3{gUHIh!g{ z8*n!ya)d_(Pa@j=nbM%EBr;|V99N38%E8&n@P-xA{H8?2h#^~2Q80@wbs+?;POVGs zA_2cxj(-WR&V#8)ihsyo%<2rL&4_j(|H);$D5SVR26(tYXqD8PRd7lTaG{ZB3JyG; zyX(H(9e3yLeL!>W6=T4L_QLRvg7AtfZ|IKy#(3pbv*&xYVOu)nzHJ%qodqF7mYgxG za;&Csyta6(x^Sd2cf_1EYRMU|DV%Q5O}84R+srd9&f=mh!1)15g~RE$%mF z!U~5f^M=gw;VQ+jwQ!(3v$G(!I^syt@fQ^P9xpuemg?%Jtljq&pMJYw*V7iatsPDF zrs{Gqs|=(b7U>F*P88LsAng@scMzw8+7XeS_*Jq+DZ$};!nD*9ilXXgy*Uv#e^M+` zP?Q?|V)j@f!CA&w>=bIq5Ez{yP-^75#MhESSqg!m*d_e9I2D3+QNN?@M{Ni8pHAA7 znHMmMPW+fHlkBgU5_IthSLzzel_kes$=m&ae8-RS5C5*<;4dozH#cW_cIy&aN}P1b3LtCW3)wEpt6!AivtU3o*+{9avZbEaRp*IEU9`03Xa zhkl=X^2y9SzfN2I&x$oaZYfM}sk1a!mjg&f(ZJ@&KnimNW6mE(ghpoOC{q=-=t9v& zs1l0AiBnJ%RX;OuNNuG4BD2kqF$$^p5^IC(gvF?|mV+r964A?eVFAb+q2d)PLg7Mb zWSJ-f*1w17)Ull<5gp2ax}*~|5j(5HcLCAH)Qg>YfqmNO@#=i| zM&LBlZklc`BRgv?pK7g`X{(s-FwJ&YX4@<0yDH~9%=4XiZJKE_&bHxe#cZc_s?`h> zCmiZQvwWaDeZZK}SDMmap3$vKZjlGr!Vl@LtS&nDj>d0$-jU}MKmLc5wcky7U1qub zS$j)eOHBn(Bp`tzERq5wIaQ!oPbe-qRS896n(nYgiH9RLHG_zL(mYCCMltolsSP}8 zETuNktZ-0Vn!G`F3TS9~L?B7doGJ|&T&l=oxEH}&B^W6r^-=DjXVSMnn)vAt6W{$i#fSf+yREsk*3?>Cu^h-I$s9#= ztjibD1;SR1EwiX&nO6K|Z? zqzJ8zFCe6CAujw}M2wK|(zFptm|P)nIfYIABV@^FK1ld+{m0~sGk+2BPb4qEkBtu> z5+As+O5bc$*G8Vvocn|3^7F=^&yCkN)+8Kl&cEK4>)ThF*rSeW&%f5IPiV`$*r^Qc z)5Q-OQ)lY+u({cG%WO~WTzAcUPtAOveWAZ@q0hcJ(6G>7&zEDquXdr&0W2BFYFH%V zBFqs$PB)cKH5n%BG(d5@RyATP=r2v}$O~>&2Djz~*T$bQ_^el*d#m8gJJ|43F^WbPiinQnR5@Q2D2mXC7|(xUcVOYizTdTWfID*^&uLg`iZ(vn*hVNW*v^ zyHFIQ&MJ^YAn+5-Kakgyf>Og>%0H!^gJgf=@f7&!8?5?PleRVSYGwG=%CN2W%!~Ee zZgnYVniM`QS(iEsf(bKY+K?ryPZcs`OhNuKQJs&w538DkRY}%X55VU89I(8_!6sZc zhnmHU8$(TmB~a|CUg)#{>;+gYY?ss2spg8A#Sqt9t$Qf@qaXJ*JKF22+8yRr0@Bn{<1$B)sg^ZZDZ!EI z4gRna6(@33BH=`fipvZwl^L#Lk<>Rl%fZ|m8=?XiRf^g0d<}v`ndfxWoP^DQ~E* zXfI4@PIkA(>~mzCYmj?4=K0seA8b_yv?+YMRpF=*khY9ivWCjyQ0Gn9^5FoO)ihmSI_c06inZzq zyL!x8G*Fh&RTSBj=3N=QyUcr|-fMmSsW)?WKbgAe(d19>OI`7!cC)&p(bn#;v^mT$ z$F^nW2ndB!MS`{*MJJ&uDh-KB1;5X1IPs`X;s&Wrx@Zwg-3+O-$nF$|C}pQh>P6%= zR5-B8Mn<^}D?&*n&Mp*M!X+&evKUNjQWgpq>Z&575GYy@HZ|~DN(d}C*_~; zpVWR6{*%InRo`4=>dZ~7jsBu4W^X%UUP(ktQHUe)NVhhwD?f11m_A-pfC^#EoH1IJ zJyoZftSg!8sGLLOWBUVa6!`|~7yIjBaDb33Z=~fG@Ef6vfrKFvmiT!gIYK1PmoFbvFi^Z!(0pfE-M4r1j=_J6)r# zH%HoTj<(+zYF+GW6!mmSUc*gIv7Qmqj0LoR7J7jByn^N zX7;F*-AMH!Nw%ou=j?{*H&QG>eIwi{N@~HN($u3QV??o!_*JH023!~-bEhIAk|9z! z43vpNLeQZSo$ZQ(IUr=F?Hy3($TZYvCJDF|rI59lpT?ofD*)+%Q^%+t;KnbxxDX6;Nn zGRbmS&m5`+L_VaTz^{*hTx8^K3^m^zZoM(uacive=4c15TVvg~#(U^HBkcfqzQ?hE ztE+aQ(>~WxGuu%;-Gl)fYZi z9)Bx+^MgsN{v~zwPX;<$yBcdG6zeL<908#n5IXCPB@~GnmvU4Nip;=C%_-QTX!jG4 zPItPTK9y!vS*1a>II(U#WFtjHUJ}R!2H=y?zCVa6oQbGVH1RBiC?ud|!nM>36j`X# zg(3^(Do}_ggbOAASwL@E)JYbE2Q+JdpB{x2`5ZuKuXMy6bEKbdD~@PWM|T<1J4@r6 z0R2$2|KJ%J>6!QX*0~CT8I6?fA-ZQ76L^AvKJ*pBOy21c4Msd=4dCtyEWEz zd!m;i?7ThR!zgwUgab|UedJ4l-+YH{zN2=!wQ9QAJXK#lQLUP=6~Yk5tc61rIlZdH z_ME`FMEBabbCn^7jefgyo*Ro!eVD!b$&~eX$G!DW?RrIbYh72PjSLYNqsTxKij<>@ zG?lX(R84qr>rgL>&ITu_tfwjv4GpQ+55=?8${_lbiv1!q%-Ile+W{fmDOP=e0jJpv zHpEP6#|G{COAV0mP?A&BD~+=(=VDMuK+8mOCN{w|%3|1saw7>Yl(QI7#e;=eMxluk zg1e?jVf4b!;1jmg8r!N2b&02HlTJ1&{aT8G`l{qzhNO;?kX~bEZ&|{qO)*(tGTmB+ z;(ZpyI|0@J{|O-R6^2OJ=0F3ikj!qZ?dEvL?eQ+a#>jOMc(_J8ZjZL#8fm*V+CJak zKvoD7Y`4y~Rn9bBu?BF6eScX%aiJT z7XOnwW$6^U;-c7JDift`9MA;{`kM{WStC;JNrU_Zq00nmNZe(D)DaZh3c#fSJV}Tx zgfKKFA{t37fsy3#5{rfq$R_A2A(rD;Q_g6pN4swh zx7{3UxzXReIMB4v-+=fB@L+#)O_o{0uYAf;HdU>euojP7i^vKq^9K!CJ;ibDdEw2u zK@DksH8Gc~B2E|s4`|)iDGt7rzWs@W)!#1M_w>*}Pj_=oS5tLoqd>7rpxAyViozCA zJ2`n&c1RM5D(Zb|^mBGfZAGAns6??z%4?hj1{oqXF{DbL4Ux3h6cMQp1+ANm=K^`I zg%Z)FS`aQ6E>zU=k_k#9EYypT#PiD=5mE|DER3LndBz@>|k< zY7&n(DE-^iq3tE%UHa%=b7r?DV%VBJWJ#NB(M>g|X1lBlsMbeYQ5ztnaSB5j4eA84 zLg0ji1*S$`lrD;b<6Sp~;XIocdz%(|8|J#~vyJ9yyMEeUI$dv=uG3H1^;5Mvd}rKJ zFmB8nw-z9s88zn(l%*jScH~F5DI%IOgKFciSi?`6uOHC4t;;+1cGm9SCx7Wl>ty00%d_IB=`XHz%c8~w7Z$6@VlZ|G^UcQ@B|H6yigc~m5* zl1Ft_{jM$}1w|(nZa0=7uc3$|+^JOT)BF^Mr>Mp#b`}^^>0_Ko(BG8Th%!O65<$5U zYnlNFS(-+4D1Ddc7^f}`bZ9&$q9O|N6q(e{MMnwXk%X6Y2CSkGUHCd9cag}2a*=D* zAu51{0(i*05%UFvJt}!?l9waP)1K+!$hzEI5ZI}Y8?@$jYQlO;qx$rbGfkSA4kP$a zDglRD76w}uN7@#LTNhCz3{b%bb6gl|SsZR72!$0+^umjBIoPz&Sv}*>&D5yIO4Emm zV}{j9Lq#zo`t)(La@>+XQJFthSukdh1Hy?K4LQ=P!jY|04ZXDBT&L{{vn@v#2naF($6D%VxR1Ai37D~htbs@NlZ?cv(RZI4VPlZ~z-EL{C ztL$v3=}7Q~lFXjtRh@LGA;+Ub72I2q-d1?6CFksrA$ht{Lxn_dEkfPR(XRQS<^_;v zY;y}h5wGD?;aZ1K{~`bE=BsBBxOUlQ9I6TQevO%f1!288{)76A;j+w8qjIENK3tkP zZq6Gs=8OYHQ{H%G!FY`tr3J2G3%Z7B?aJtu^uPvqh=j{k;U_G?N6LM_C^@@2XV>r2 zHs2rnw#=U3J-x#ZO_ zT}+}ks`R-JMO8Q$O{A0MdDIh@stYlU!HdI?(GY}UTu}#Up|h5txt2U(f=jg^^hY?@0}@XL(u^PMCu?*b|R8 zE3eii9BImO>ri+Pn^LCg3PH!rcH0(_m5}`j{Mv57sSdT`#R8n_a2sAD^F;o6d#n>Q z&0Ldyx=JxwjXF;`tW6qFCG_Jeh#4x&7_N|y;404RtT7z1^9pz|ZXhDK1O zhzJuRUn=G?mRM6ZMC$3IK$K}RL&%F#BEz*r4vi*pU*0trL4lB(@;uHWbp%YX)`VQS+s3?9b|ALaF~D%oC_r{aGvB;N9YCe7b+yiyB7!Q=35Oj_M-Vt8_I^M zx>9({iCPT`zF|uqL1>f@8?uM>X(JUmqZK(LMmhe|XjSoejcU?i7_Zd~7&5vFV;Yh@ z8&dr!mkB*$^4n$f+iURNuD-NZvG3KSH9v@WLuQLOHZ;)N*WSn|)=4Nf0Yx@Mk)Tpg zggZ62iY_r%Q$hwuhA4DXh=^i}%9)zFDt%5(xvejjSy7FMCX`5O;@A+ygd#zRASh!- zjl8HJwVhkESeoXVizrFOEHxQ84^LAmqmz>pCpued$8$TE-kc}|i3qh(kDH^QaG~b* zIt!9FJguG0_C8f^U52|UXp_$E1$)v7liO3aptX+Z9lgat6SW2C>&|ssMg512bRH}k zGSAWWn`7-a5D}5Ha1^8}exeuOS?Dm$HJ2@bdmCy-`a0ibpJ}n8exGct7`N+3s)~k8 zieYo!kTG|pvH*yVniONz#bbmYL>q>YN@brutz8jT7k|l-b`4i;%mt(Gj#9TZ`g0!^ z9ez={=l5BgA4vG{pKBsd3=IOpdR&BJtD_qir8WqP$Zn|Q$H(MK(OK_1i+#~n{F)&m z237OiIroH}(o-HGUe20|{eHx^QJK$44Gnw~iZTj>B9W0xi42q4aZ6s5=UPM}BQe_C zk&xuPWP&0Jx=c`qdPo%VqOXR})9x^l{ZSOOg55wa*Hde5$ni0SZZ~+oQxo-t?%=;w z1*~dLJThv^nzR?qwv>UFneRtA-+)|nVHgw)F=x0$7J6f(;|3DZ@!m!F&-RMNF7wTS zrZ303a3R?N9W&igGu2u((P$jEYlkZf1}kz0jEX^%V#urSP5ebm&>@5SM$L&g7BoidI>XAGDqB*;h}+n&PIZe zQS520BeL!ktSL_pi{WpQ zWndMYLa5w?XqcE9L_`@SGQ10v)iFehis>?zR`6&U_vJ-7Pgdw`>Wax*p~XhILv*M` zm>>$lQfCOHER+&ahXvFyq9C4A0by^wts&d5D(0}k=iQ1cFR1r^(|YxtfztS~s+_T^ zTx6tk9j1kzYTyB%xiAbaO+eTQ@NS}hrxKzE4i@SPm>qF3$VkV#@dLTdODP z%0{aS2Fr7LbQ#^Mq+WgcK)GVjQZ!zp83VQE&`&m0j5`ct)g^=IH04LOq+M%B_p_&X z+Y{YwQD>?`j~cG5E!p#=a?|&to|5_AC3F9g%pP-cWO#6(vjr&jw>S0?gh*{TE&{@3 z^}fhXCE`uWPDNfLMMMgUJpAUW5osbE4Fj|iMRg&~e}ivBQo|!P>`R?_DH|dn6q9D~ zt?;l^4uaQqGBP|`&3z?F7sGu)F6UwR=tNUTNhk`1oJmSV*#wsg378<@JOiSr(t6{d&OjSJUgyCjF4w=hn z*R2TzzusGu{dfViP(|FPbOxkaC$dvG*!h8$q0*$*z_n$&ep|BTQRN5UHlKQ_HN&e{ zpM|U6R4|78#bKDRmyXvP#~gaN);@JodtO8{NSXMHw#d`v-kVHUcbTqzQQ^H+fBJ3p z@t1Sf{y6w?*;$#aaO1P%lVgKjE&ZL%104+rihb=I6kBV%T2N!amr_s^Jt?H$h#N!MsEH_c*@Vex2t$lXaBB%` zcb&N?mxI)rr_oN5R**DC)Dkq*LVG_*7gH!H3MmRwA_{I$(AgpiiogyNgnL0DjLfYI zHFh1KkNI_J^nBLJbA^>6|25q z7j?8tlQvMEKWtV`)KyG2S57unjycMP%y~U32p&Tn32v6)gZfKr)Mq{{^WIh&e$pD} zW`|Qv@iv7XD>?Gi^OEu=1|@D)Q~S7Zo3WRo9w$i z3H$52J<)#~D8dk7dBYty2RjxATj%;3C+o^;p_cgIfo)Iy{M+C8;s5;kZ{Gf3v$@ii zosgDy`AFH`=evp%dURPsm74KJ^LT63cyr}=gL%-L4^pNs*|X~Ue$CmB^7p-3>aoQU zb+|s}V7uaKOHovPZfJFqN4d}TydC#P{a!XPF)`5HHq_MuTO8vJm~_Zy(H77_2jJaWq}i`E0#!6N@T=n3(ZBKmVg&sR!fixmbGv>aYrIb zCTK;@*40#t;Exa7*VERNdab=U^sB|0uWnC&H8Xg#uYRO7ailb!1TVd{b6pUEnrAyJ zL5-rEK&ZPtiFQ)|t*L?AQvMG0igKzxs8?Sz_ z=DIxpM9`IE$?}b-&((G`=ccCD#0Rt{T!;5}7h4|NddwS^hSp_zrn?-It+oMkVRKHf z!E1|r&+|pQo?Q9B5AhfAe}R5JZfjP4@Uwq^R3=OQ;Cp)a6~+6XQtf+cd}4gCr){9S zm9EZ~epn%uiOUU%ZfW=~@-859V$S<--#XzdCU6w->NM1~kqg0KdT zl;{|$1rY@)k&zP79`G_;6!)|?%ndbX3kMQ->m;?5>-L_jV>GTgDuXq zR)C`cO?qn#Er{+fr+TT7pB}tDJqTN*h&VNPYpe(P%S@MJq$0O5`C6Z?eD$hz8+@-n z`uuyZt@_k6Bm33Wn_Ai%(&9o3d@t7ep13tTI^GP?aO>iD@4|5BRF`9@T3erat@zZ3 zS=*oXdgB3r_pOJ2{)3OV-gnL)Z@sy%>fo)}iY;)$N@P)iNgUB)` znqkOHAo9m8JKNoq@s8YeO) zC=#faa3!LRNJPmB$pqW$5ew%_BL_~rHCJc4J=*oly*yH@pKLOZ)RfKjH{Y1-2ZYnzjzOEYF7vv4?+e+xo?G?1 zpKsc_11P?G_Ok4s{-r1<@pR_xYpQYrZ|yQa3W#JJj0_Lj;h^^BQ4@ z6cmxKHB&@%R{G#;q@+gbBZ>(rmJYiLM5atxZt9ZNpqme6lqv&t9qZeOvPN~t;m}EW zXGftf6g_&0+NPh7)@;$R1W&qTFfU3nZJsgXaspPktS^BSi~M^Pm4l)w!R0&^63nO} z5LScKhYO{c-|FaXZyf7w9uM3wn&7k8--K@MS4dLOd1y7?=&rs!(smm{rqK>4cOf|h z;ezHni0m&Xdtr!QP4#_6Kn{F4HHZt@%`NnJL7xt`;V0*M8fM$8XP|C!7>3I8MpS9t znc zjhJaolZ%vb210I4pqyY{+ZhN&UqUJeIS>-5P31h}CzXTZAtiRIqiM3UX3TBHlqUN| zUn4O4aujfevc6)pN{isvSDMpPkkXNOwJqMK-&}%nVy2@8f;My?XS?dAnkt7Y zHErrtz2Dx{t$$EmJ6xZBHS4=kzS7pocgMr}i|W-{&K1h)_EJnJ_<(& zFTjBJH$iMT+hQH7EFRKl_2tI)Wk>WCC6CzDAlpEkLJ$o5Ll0!3uW_!;2BxOBEW0+< zFZa-!isK*XgO1taJZwS7jh8+*U;V=1xg-CJ7gIMp8vWismtI;uJu@>p&@`B0>|DACK}KY&J>Maw27P!ln?biLG18M07U@LLS+5%A6=2jamh@ zCV-+-V=s|voQoPoE{bvx@c>@5r>U9}85F-{g;YyTbUG%JE-W@#Zgke%8fy7+yyF%! z&n|P{>Gx}1{KkzzWTe$-HqCWdZwxlv8U=(X?YmJO-WHB@YLNa26sLgVAfTm|6U=n1 z;|3t?vQO8W#;S^k4T@ny?r2pZ=(KS=B*nVfHdr<$X&P@10qjPIOJ^Dl5ahS!M-`r0 znX%&;jn8&NzyY)W!OGy{){t|R!KX?+cPNj(pR(@ZvU4kEW@cc8Y>05D6cNb^k(ze3 z^mT&!ChoMS&Cx^MV9rYgQ$r96iIk*|lJZiaHRS;eQvQ)#Sgb(7{#9wmo0w!1stM#M z$W%}rBB^nygvknV#ttAQv6E}@7PmQ^BcI$LB&`+mYKVm_Qxn}KE+;ey&L{`*d^rOl z$_dUz>&cUJB9Q^9Mu`l0QF1t)jl*q@c~#_%Is-unwctSgoFQf4)CbKU{J1Cl3Iy|W zEfrv^XONNhH$bM1jv(xetZ=gLE12vw8RAz{{a;P?B97vlKo>?Sv}=pVj9M#a8_OY< znXJ=KH(-K7ho<0Eoo=qP8ow5V030vum2xNu601uF^yv*Leo3polY8hbL%_arzb`60 zw^oImtWEK^Mx57P{4{O-LlthHP0!523WXuUmk#x|p+*FX{gj%*moncb5#R8oEX$}P z>98{#!VtxfqS(R!zLf4EE2E0ADwmW|JbHl}F4pu>g9y7PC@Gax!mf-)$l7Fl{18ii zg=CxC^a68Xg{+l}ZUcn#b?U(@>w1p9H=Gi@(Ah9oqn>Hdp|3mBW(GS0PkVceTTA1;WN_p~ zQBe#riUVIwkNOr_x zZ_AfMZ8ut~rj6M*Cb}@iLhKBh#IUF@lhMX%~Dc94TG!rG#RO=p%AC z#8o4OLxRwXup$~4&DAcUsni5UpB0)Y+NLQL_*5OjW~vapq$LaBXz1vZC60#c3eo&tHS z)Zgr`yM;F7P{(|eX}Yd-s#e>tO04zYr`+&h(yM=`xwys@e%u^(tlW2dna>W@#kDD) z{G>&dG&wmwKGY}q(mq7Qc0@!`AP!JcLwPAD-Y`U}4k@D{K?aM4xjJ;!_{%aHE-l0g z8|odh#8mLzED@&muajnDtv(;`Mp7CqIYBxj>UwF3g{UZ~K?T^s?!bzdsI^jvonYo7 zmnjm|sI#a?o1Pj>%X1knCjcRGQ5)wn#H%5f0W}QILn%N{`&hf6z(t#|Av~K9&H<=I!$Bc>*W6qE|8N(H~hgv}qd^I=p)r5VjRy9_hJ!Vq$#lrObn=7b)jw@jr%DhG_Bz91J4y?QZxeZ`2#4^c zl+l2rsUfBfEWZRHXEZhvWHdmuzkKe3$Gd5^n<3=A^0)+qw8vf46=FrbIM2<%b%lt9 zqA0v`{LD4GL~UL!3I#7CDJ_bZr=z0ByDXPsYLvPYs0aaJ4IpIvD3_r}l_8{0-r0;{ ziN$6k>VzAumDAeP#jctgEk=C3Jw0)Q^r8*(UDfCs-W;F;A7m-!T~J7XodE_2hiro6 zRLPf$popv$FeAl~Y*4YWr%Uqt1Pwzf9KWxqU!> zeLx=Ak>*+Y^4$&bZi?5xS@7xiO#ugOahD)P)LmJZf8e#`RX=JfNu8V;A0O;vUy6(d zz7*9V@>1eU*_S#q8VZL{MpbuGUMft`IYt8rs|muTq?9unWcW1w#N+uSh@#cjm?WhQ zOk7t$(w3&ih&Ev+ehY2(M@A}9Yn1!KcMHk3 zu)?OQGG~L3#J*BRQCCSR8K`Z7P?#Vftfxn{t7WLWg$Rzm&XLyI+YpPk7!mE@A#Y7~ zqgr2VES;~_Eq2#JvNlUrh#ayNGcLH$osh!eG}0MB$dsFakX}$~N-!gX9fB;l0XqB{ zC}^xjgWA;Y+|a(_gsCR;B7~-u*_HSIP4j0@_v^BHvx6)O=2z6i25$C@cKv zUn)b6*TlJ1$6u`Q+nvAvg_PCzRE3_No}C7M;{%k@jF2NmQra=lLv;l~*s&Z!WHhMm z!Iz2xUrI_{d^aVff@b3_L|C#Q1W}TdhC29Csd8wQGuO-WK<%!(PM&}wxh16PW>{m45g#XAr#a$WEObqfY8>B2GdeH+9<3L zv2duTeYh95pmPct4P;A=r8n9up`y4w*81gC&sVbpup}_0T#47g{zx(d)zfGvLkQ#J z>TsHAni(=j#*(b?%kkdZP-zUbF7(#VwcBPI%EzsR{pzI7oRD5k+L%>6VO5RfM-JwO z&W-hsR2HFS-=WXdZGO}de=hsUf6sYJR(58kBgMBN{aS6jI|kMA4?dr|>U)NZ>t^Q{ z#)f;xhhT!huN(NeN<(S_cQvEH7nC>p_>=)Kgq?L(sw>1W8#SIdDJ5kh+P}0i)5VmM zBVAHMVMlF_M0N`ZG4w=M2!aNsA)Qmp5XvRh8qM)4F$9Xb9-Us^V+dbL8+-{uxMr5D zai?CIJ(G4Hh{3^SR_KJVj(8dLc)>Q^Sy42zBL#$QxCNA*ceX5a+rNa7QRWFcwC&5W zw%fz?H~Z}ieb|gZOGrSQLBs|KDHc)|LpBHe*z%Ce;5C|1eP5woq`Cq%K8>XJU>k-SY#@V-7=0ve!skEvmriyJhlKKQ(x4Z&XBf zlq9$1MK-4UoBj6`A9ykO!|#=ye{XhSacsD6e5iMH5Gab$f(m^0qRq=7gt84CVCo%` zE5g&fWQAWV4bgRC2vHi6P+!^u?jpOHyueo~94QcX z@nlmY($TpV%d|r`W>)kT#&+d~4^-q&)*CT#acj7fbjE|N`lMR z+xaY%7G3(x9z%AQI;ANq$m0J+;oj#`R(zxE!UwbSfUqA)>DXX5XEX?h$Y|P$W+MoZ zW}~iv6_Pj+5V9i`64O6*q=IH62+5J6G$cVASNE*aM^cLAZIx&oejP&U8ZL9B5`>W7 z-w7e=dK8u1Dg09inO&oTRH#P(j3Z@gMuL#6kl0aYEEHDQI>Zpdmky)MLXOah629T9 z2~aSE0bx1Wy@-7yUDen!L&Fur?KhEUQgztNT?^!*gdbW?1R;^77%_y7t?Nr9K7hQt zZlS|Ai&bCMC8HSPEsF0hP8hc7rkbl32OtB7XoDs+K)=-o?eDEB9d!OlOXtoR3O`eyX*_CRkLV3*@`et(N_@LkKu~ivYE~rJPOEx;gjck>c;K5*0@Vus^o!cZP~Sb znJfOm3I}?S>5UB!j5U~UbePea_-eEbP5cF8ob{Q1TNvvE zH_d^NBx_VN06#SG$)l3-;X?Z!JSwsnN@NC`Z(yvqy?U<6glR&CFuh-u)L)i0URMF3 z#w}EkQ-g~mopXb&Q%x0vs5eS;TB6SBj=Y}x@xSVizTBJ{)LnwX|42vVX_NcfqJ2+i zuKb^Es>G?OiNDN|O6ko1PmUBt#sAWg61n}qOlKfJ!~t{cNX0^n|2Ul?j(eGEP0C0q zow1U}nH=fzx^Q_q(@u2-@l`$JNY+RC$3Q<;DMn2hgX)O3vo9EbC+jZ^pXsn7se$m` zHA)ZrBML_JF2)Ey>h)7a-%hP#8ga5OwpnKzE2iw)32dy?ruF894^`yObkyE}dSkMG z5lZ5T?yrIzu|BrQZFYOJ~G^?NHDN zN4mVI;1&Fm_7F$fLUN&!Vj&Gt@F?M*6cyS=+L-$v6%|!f7cLbQ#ICuDia}9Sz>%^Q zqSzW6>>D2$8U-ueTsBf$0tx*j;?{6G)~BJvfI(57Cgf2jurL5mtVIxQChA6Y!hC6y z5L(AQb#v|2vrT4@XBc1V&yVU#yE6`OyXzxLmBn;)o)IMJBq+Zcb@>c3ro;`M@^j}`3r)!f431Rk>CUOZgz=XH48;)PXwE*v`3plstfV4Ih|<}H-cD4SRs;{k%5W6 z?#ZUInJ)8mn-OF6qJ2Nzik3w^O^NbC86HSuAjt$VVo!1#@Te$Dkca|5!Ew*jl}*`o zW0t(`Z2!*OkRfXc=(?{a+lQ|o+xY(qp_=r6nfL#@b=@;%n}1!r_FHA!9&v=9Y>c~P zk34Sj_*8rB)q>3rS|g56&&^IyMFEbqca+!}stc*KceV_ z{K8e*n^;6cf>JQu&M6rd=VNXZ6NhyD`O~C)kMQ zMqS9N8P*;Ob_NQ3R?P^>#S+1`1fd|<7(zJGE)ffHcgBbNC-DE}`QvpZGhLOlohG#J zZw%H?Ht1;e1way$y);%2E2RB0j9&-QF;HEg1=v>)2tkC-w_0Yf|NA$Y%nIk2dn?#sY+6xFfaYs;T(cKyDn;0G#ca)D+tH-U1={BHfyfM^3JJ`sV zV$mVyE7~b%AvF!HxPac`_Ha9*AnHhz^EbL3WP;dF(o_L2ipiLsf~Z>ek7A$rhp!>$ z`r|t?**Tdk?Y?hRTwYn1;0Cg$O&(UCaM|p;Nq^+IqMc9ZPrWlgw=gj>FgEfv2oVbj zLi#uo%`MHXf#&AL7=j}eEkmcE^y@UYutFOB#qE`rVMr$>5Y3IGgp~ObN4i9F^YLBm zNYOcz&Wdz4n;1gs7vk@uWyOw^TE0R!0}=uKNfypvGZ#2gOrtT)O$t(HvxyYIqEmrp zQ;ldgA;<$l(QHEehcBg~movF~RFi$iOQr|MOUJ+|qVa@ykr zBZDoDw4?kd$rDmg!VhdtDA}ne6*c3}gTMf6x2P{i;nb)@SZyrl1yKHl9 zrZH1iUvb1_O&-Z6kgD(w6QBs^NyZ0#+fWPPhjNe;nT0O0!kGpG<_OyoFP3e6xYB#; zkf~@OGWdovtKZu_{nL+=UVkz87Y{!BjsF20lYjF_&6QKCSO2+L8QE8!)mxg0Ro#{T zJ9USiE!p*i=I9&q^Ebvv2gXN;T64C1$%`(@XIPCW#Q94KsAh}-u>uPHUYe4Ty7tc9 zLe6FTk|3CtnTR8Z#fVcC8bs7Dge*VP*|m4d@}-t9noUmOg|I@G@PcF-g6Sp^DIF2X zR!IFqNdHOVA*A@OX&7d@n@Bq&T81v+1rLM@j*YF5gck%ME~($d;jo=En(nc|9t4}Q zz8*+j=GrT<5SG^ZVrc@pzP+_0Wl57Y1@qmtB*hrO0=*Uj55t8hHei>SyN8bjy0osu zhQ97ZRerA`#NofYHgIo8LEKDZ<+M#RniM$}7e199JC+bS800=4bY84S;`Gv zn>1gKu|k$VNsGGh6wrzimOt@X)FkDmBeGobCoQk2{L`cq{R%M+LppB62EnoQkuO~y z4%^w0cEXV&DMh}Hfg@}`q>XEm+iai}vHkWNefAl9$xMTOzRN~UU|h5bu?5KCD^Mg7 z4vU34s~6iW)AjmMLuOZ|Uu(i;kSqfxbb!kVCb%W}6EzEk7e#8; zk8)yJrwJT4N!Mx03F#<9$SX{j)WC40)M+9Gn_$;i{=|!+B>5BX6LQL*Sd;%X`4gSE z&RzRI6(LGvX>{TzA6kHxA+4(vV`-F>Iz@=iffx<#RjGm%N&`(xEkj;6N8wOv+zSyR z((VS5&%*O?I!@KGU`qSC$D1u!+zXKAdua6NQoA#+^{Z2dD~m_aU~05XV5YFaJXxb1Gvp2@ z1azI;-gRML`{|uEAHS$wdAIz-zc1eYur=(6J?^6U+E&f}KNf%SyXkR^gbt67z>6Z0 zVJ|x15+QP@Nyzf0K*%CQgbdQ;BauPN9_c8JIQ@wT5%W!)j*2#g5Ft{VLWmIg0BDAg zR$YoSNx4lSM%1|9%cpe90ijs;gafd#x|yZGyeo)~o^XyeiPBJ7x{Y8<84VBjigoEO z?S)uT!Vj8|&xqlAX{M=*#_t?rCWbPajwYZ;1V5J+#L@J2jnu)V5@TrLSyDsm2$q#vWO{dur_>w5uNX-T5PMFgZ8ktWU>-_OH#0?1e;|h zYOzw?GSz0A>a=4T4Z`2%bl=*D(+x2fYyJ0Hy|?I&ydwYPNAgdT|zWR1~bbK(kO3h2l^PNp+E*0GBD|({Qc~W-6rlP^s(dTy#P6!ApB%X+B$; zOyl`%yJ2ZKl;^XxwCITi`Jy_cjD`aM>qu!u5{5;bEhpfI0>1&DoRU(i@!N-cItDR6 zU0XcUhWSwH@ltuf@EfkN*wWlpJ>O~^PzDZ{M9jCE=9|hFTFvuq=K1Cdyq>Gq z&(-N?ki=T@CaMai9Hm%@Fy+9xB$ml$%S3}|$f|8GNpvK7Tf@&(1s$^l9yYqKFWmc* zV$-jbyPql9_mb}PJEf;zE8hELzpZ>`ZiZdx0P&*aU)MFA}R7ftQp=}aA*%A9$ zkT2GIk>p}YfhcyE;M5tUqdcERN3n_dG}?11R2O_iE*+l-)dg+uT@vIA)rD9XjIKS@ z+{?ydXlb4^DV5H!ld5}ClL{RoXEZ!qNF&-}rebMJ!q;dv(jiI(zH=-_WZRUNQbgpu zluC=vp*r(OrDCdHkAq%VZ4DEov=dwm+Js13Xzw9jV+|B`10zjsF%K1nHTtaX&-R=s zOP#LFpRO*LwiQlW^Wj3LYz33JYE@W3gT0m0ZMI23SZ_v~0?npwy}Z3Rr7p#%COx1| z5p9igFZJA}zO=FU)T*K*FBk9mec{e0`fAE&=I17nh2k2fYL&fc57K5%WV*ya1pgLX(dt7l}BuLxZgiLzTIcb`=&S%yv=~q(ymy$YPooX!TP&M(NS=#TrXqNYVf^ zr9JuJU%KnYExE%b(IX|%L;2wYxq*GD9{o81!$ome(KTh)Kr%YhWJZH&nl6QTWBLMjL8p=VvEJ2g!v>SxnzJ z(=p3tVkAdO+b?M7o&r4g2+?Dr-E3k{qEn5(BtPUeLZu*2l3MnvgEC<=$vzF)q;S&UUk8-rYf_RDu&@ZMiZ z5WH+rf^)cuhtqIDW5P@g9^uyEsuG-=HCd;gMn&IgrLiNiG>8`EwbP;}Y|=vuzORAy z8^V|NVXLKBk57yB76x1KpBB1_*PdyyjGA(L6~Vo^p~K}l;}D2qrWg2i*rr--$YsVI z6=Sf)YJImR-4=e{7`VSO>XPBwzM?~~$~Qkk`RCNk^vvYM=pewG80{xU%^3m(sfMsE zqM*}-HuH$6Yaf&Yv_6x=Sm{N23*KJh+~-A$^>7@5n2Dhg(WP;F;YCS)$igQvZqKVr zq=5>^53vS{PpyP@%{gw55mD@Y5*dv+kBJAhUGr(qbr-HdZBgLU0%zx-Ht$^{UyAM9 zC@m;2g{<2(sO=<6Sy0N871E%#7_LAf&|n?Kxo7aAbr?G`%pn)WDs(zPq>;=Ht1AgP z>>%ZRvVHg?_E};#V(UBx3duk_Z()rP#A^6Xe*?ySXOOlu8pmoheVUYRljE*-AY_8art^JA?+N6I`uH(dRq_~6S>$BZ`F=WpDcnjC@sAp{}|odC~3 zSq!TVDT^TmwH!XZ-9k;af z0=$ga0~6xB(%|F!m<2Vd`wA+m5|Y}M;z-d%^IsS4p$ZTm*@7C<#Z@x>*BnOKD$aUeO7Y#^}_vsoEqq#nVp&(ACmBM zg+K|vB^OGJj7VXeQP4F?!4D{}fszJdXm5$o;S;YWRs~Dz5|%1LG1G*#*t~j%Pg$qM zmO=z9r1-pgh7NV&K!_bsVls`^cwt=vErFszUtU@wg+n?LM$Br{>L(J>&?aXV(TLu! zSXv^Ds7X_Xf-L>h`52_8uB3)Kz&u~U)dj+#O*?`^1dTWhrf9mU42%p~yCNf{HO{;M zm`sqC$--MA!NCM*8|KPjd^d-HANF~5-ozZtNYBDh*Ze@+!a(zEcl~r{EmF`?Xza}j ztbS_Ei?Voath}lfWy)!+7pn}rcoRO3=mB`>zXLqR5B3MlFp&iN zgRFEB8-vENx1^7jagTK0810%HY{SpY_cj1RWT6uc=8@qt&SVSfU@F@Yb&KgoX*5kvMzSq!xXS#Kzf*wZKz&%rF; zSYj81qDW-^WWy{exaL9^xiw(h$d{U1Ii%EG^w^&R{@=;pD27>$RYuLmBFL6Sl z)0grIy-r`s2WyGdGtNz<(hfbuUS4Clw7^SrEx32++QBC6y&x$~6%9Ixh=|@(vt!tz z9I471GG&j|6k%f!0wIozL@b;IFG@K}{XB)kR!BV;sI+fI!lI zWo+GxL)bRkJ`eftK;vw8-4up2nqi2#eoJ1LHoZX}f(=d?Z#^3Qh%EiX|C#;iPqNnj zAb-d2CcE3FW+uq^#>nyrKiHq>T*CMSgcJfL`=iNhX=xCV+N@Wr=Y5F0o0Mw_%xBZi zRVLMz=ChsU;MdNt;9*T+g0#Sk*8}rF6N-9iVLr|GiVe@pR;^15ys-HR3%o-0NJ^b+ z^!RutX#td}aA}Pm`BFMti}nFa1N zZ~%}4LTo~;o@%KYuQLo(6?W>1>KS_sLS% zf{!PZmRX|r#NDh5h?Paa$tckH7r4)p@et&PYCS39s)TF1%B*8 zo%<04sm+CiSS%~?+Dp5E>EsG=cC4VborjN5kJpup3Q|UD^D-&3%!@K96H}H$8@g$S zUM6os@4|Gnl)4aYLpgBD`myFs1RXDC;afxwsgGD((zj2Y!Rw1FnQ&IP-;Kf ziErapes!NQZ`hbVWX>8f=Ymwj>B)3}EA6*H6r>|XD2tKy;o}S~Brg(vcmXRULmchB z4a+0@>%rF>BUr574is-tM$(-Rt4Z}SUO$+%_4i$6d9w=(QrIKo zWAcUZlN1#qf8i2hm?(HoK?M;*9SK}g2&C>VO@oTbdg?AYmyzDN$&$9OIZcq)Ao6Z! z-q0=1#iQNM#6lw%6=!eLt`S!*iWBi@?~^z=hN)4po|}&yAxFvwhQgP+7SM=^U)O>4 z&eP6`sgd>}@)lyM@x{>Z(pK4}<3+xnn(|6L3(n%~F_jD$Qbw!thfJAcw){y)$ut(o zwwpnIqPv8{eCTX6t}94{5C6&dIZ-4CZvnzF0uNpkF7yT_b%y{Rj%UIcO*@iOSmAVM z^=z9B>+;5`HT@PPAgoLGGlieTqV1gRzn`C5q|SrXg(u_~JXa%$o#(RnC%9bFs1cV2 z{E*1-GFfWPi}l>RE68>7h&WeGtg)0fKEeK^v$*(ZL*9Y7baD(589F&;DUlJ>wzSw8 zqznQfdr@gg{?dttv|e2+76Xg*>NF)I&WX9>s4Xd}p#>(=dUcW1NE3%ND1&qEO7L*u z&^NJ3NLnl_^)6_7n?`?Y%ze7l5sPA^ND2v%oF5yu^kO`7NjryHZ zM~Mbsuwq8czKChwr9xt9y?V6)S-NYhGx6Ha_3C`suTYKBNxyWAHMZw*BFgL4sT`zf zH0my4y}BS}q;n4FfIG398^?`EXBP6w+0JuDq(ctC=+IF=qCgaf90*w=AJrtz8F3n- zbkr6dasUX;(jf<;NiD7Ps;lbL%Lff9IDLNDoHbTkIAJfIYEa{BY^nuuk}@9>ir19R z^n)Yi^Xy=SJY2|UFfou6{~*h!HF~t6lpq8HjsXcYrvM@9ipJT_8XT{M^_GBe$Xe8E z$Zl3f)ui~8dVHR>_hr?&&t~W5IOb81APa>HMF)-d zIkU`A+UE>L&3TrZ7zK68Wav;sjK3^9U6jVMISO(Yi1x05RHIRr<;VUwr_pGctXP1! z%!|STanuM-`w=IH-f`LwpBBSQ@@Z%kquZ%$h*-%c7F$x|LiF*S5m7p@kWR9-xX7Ai zOS)@~9hGH$+Qe~N?wD0RYL%lFBrn>mrv@R8z9tBmYE!Na;VDaaQphYobU#7-ya5-bdLrb%4d0Thcx++C+25fj=T53KYdA6WX)Bv|*N(nFw(k8Dg!eyDWFik_G(>OmN&@ zG+C#bYAC@Wck|syWT-(wVhcpXE;1b(C)r8R6YL7Hr$#m={3g0MeS_ak(| z9W!k}Q5+}J3@fB1`LMzU3R_M89-Y3=uJuV{-^(joO_@i;6RTojYVDy{PLHJm-1o6a{(p zA(^1FyCjin*x1GRNjpgCEJ{vf__P>toG6Z<43aV$I<_f-`BGwPa4z?<(<)FPij`hO znewXqrPNe9e_1;A&bcjLxKpOw#3ltS7D5#`QLPxSR^oWq2}d!Ggqd#9&9ql6;7E!d z+X68%h=^7kbO!k$^$Qt7%*&I^5C^02*>)5HiInO2lI@R_-PBN|e22<^@}fAP60xv) zrrkz|6xwwlOZyGkoh1oPIU$u%r#0@IviHB5@X=k4?69%15olRmw2NR~q~edjqg662 z&~|Na<}Gf%ILI!lxfg2gd-8KI~y=-dN7{7%}_Eu9(TG(?hbuuxwd;mb!bi+wbl zn)0@FsuAh@UK~!ejQb{uVjEW2S+mD$i$<(@qc$ZDMw@EVO|_NH;l%6SYVx8GYh#Tp zw1=qfyRaL-o^@%oK?d=U0OPX>xfVnsinC2CP&&*H-1p50lqFl)C0;lcQtHhpmMilrv9UoV<|n@sSil9m*^6 z7(ZV9D-NQR@RLFyA4F-udAHILh8V>bE|kvoMQe~5QAoDSoTN4yd(V@K#9bgmIyni__XSySHa#T)i` zH&i2?b)z3PWldEVOxP5lVam!cN;EGGe$JP-pZFiG(-6G|pXXNKa~Wn5jgv#>%yh*(&a-&d9m zX<=i=waTb7Sk9Gy@`KbZzlnYS-zq~7kBkh8oRiWPscazQWALOdptPbA_<_jgjj>Bd zP*VK+lPXYzK;c3q{FWU-Nm&f<2V%YG*G}~1HO|t}+G5?BID(RTy5cNYKI7hbC^L?r zq=R6^5r(2bWTwX11m;Z`uJgCJcOgYYtP18M@c0zUWoMy_gU|(vw3r5a5*sYK-g5bb zH3w&#k5uN2kqM%^tHC+1aGN-20w%c7V_oRM>GOz%K+%f%Y|Q9lK!P;BIIteRl&r0d zu%uYnO-3npBaQ$?1j1GkibO(xxsa7i*hd57U1hEiSs7`Foxo(X;SMIl~ z_}t3OFJ4SpcW>&NpI{jfS)Le{mprEcPZ%E;f8uy1fJcp_ z3n>d_E{0B}5K2+eSE4OlbUM1w$k0Ks;tq=g?!`f{Vy52J;6--{NV!Z9N1@Yk%s5Px zk7Fi7q%#jBriO(2&f}P!=Qlyw#;4#3cS`z1a;Gpvr`8*9j<(J6`6GOmsKc!3D$N}= zrBBu3;Od+)s}i*YOc2Kt&fq+l?#j8o>P5oOy3kuq`?%3E?5xCU7!nvl=F4LeH%SKt zy)SGLduM2cH`FwEeR~vJo@ge9i8sz@23i(+=pg&qw(6PYN(e7-auZIX7$}DoCN?QT zs^cyhu5K&7uqx-kvngwT6!Vs>O|2O0>tq$EWO+`{DIFss4ufF|8^>!&__6<7I@m`X zsx9zqszOsxoIFWcsL1b}S*Ub2jA-qW#z{+zC~0H_9mA*F^A2Y|9)`T=*N$Tri3}Zo zPKWs7IA(PUPPpe2ndxj;Iu!kDCo&_ikyg#(P;}PRxDG`Zr*M&6U+N=rL!aHLID&+R z@hgf)D$*ya^KcT=D9)s_7r~28H)*gseXi4pT$GHj+q%#PUs{8e_#nIIu@xWe3=~k< zfrwa$?OnYM*q3&r7n)K))di?fWAHQ+MM2sN4PQ!0DW@|iNIG!xD*~Yf=hu(bl;E_c zfwJ_jl0+QxS{;8LR#<`)diOn>y8dU$tG-_`zl6rGQNr9x1gS;&P1Z$qHL7jYJ|r1upI5kw-o+yq_67Sa)- zI24_ZV@?SuNtF!InVP~7>EvH2HRW^BSz=0*n>a#-G&OXtwse*nssDA7JCzOs;-FY# zRCO40CT)tT8s(TZhidr-4ZP@7OX)(V1^CUw^2mSU%xuI$+k96Q0^vN4(8iV$9-M$o z8$gmww4)kJw_%6?Nla6~{%A5=R2pK|Ny`T=2KEF5Wd^eG$z zqjp;>-}hYVrU#N%e>-dA1Ea&BLM5Lm=_gnqBF@v2$TM*m6E6W0$G+Zip3j{pzlw!G z(plQXg%)yO-bIIU2xPszI44bLoJ1iZ2495Um$&~)wII%AqMk&yWP%z#5gqW!RLTAf zCVXiSS>e|rB4wvEG$SpXrM!kZ$gV?0rM!l0k-NcCnTUokY_YIaj}VwUSyPCUv_>r1 z6Lo4j?YvPt(^g8yzz|f{8#tH=uluSOKy!DPDVOQCA*-Zv9^H9fe6Y|}Gh45N(jN6Y zVxBY*BMuLxpMj61i(aEB1VxV4f2(b}(TGi?u)-0GvQL+SjI=4^T21_U^Ywiix3!8x zucU4MMasIn;$D*tv^CN3uF~mC7{a0rc;XDE<@ibGXG?M>u>{C9EGTqM!hcG~zLG$c zLm&idjGt7^cq|J`wF-rUWa43a2{Q!J=VTsob3S+Q@|D@SqYL~X%DO~FKU?x;0) zx(O#;si&K?v+V{P1G9iE2ImgqND91$Id)aiC`GFY(1PYB@R*vpfn>GK!s_1K#eU}7 z$mURE&`cVMFo53xY7cl(h->QMNKw~ghb0a_pQi7W@7;TXpi@&Son3sOI}K;L%!G=@ff1z9mK4*Yg*#C3g8~q2eri z9=|3ol+{hVcUxLi$ytnWp{^{3Pcn!@2ot*w(aohql$!Hof&^3Ab%HD5 z10QgIUBpQ`PK{DiI-PmBI~8*?6#D!8W+Mq=s#EMEfj0s;cxCCmZ&pwX=zs>z1fgPknsOW)8(<0K7Hp^^X zX@A0ba52>H9c-oLB)r^$EsuwL2||oD)loXr<3O8Y3Og(j3#*HU&GJ5Naz|cxW9pTf z*mK6fJvi!IdF<_+123j+eJpA9cPzn&`np@m>^R|coif3jwWVXvohk}(fRD2aD2|>W z`=k0{iA8e~p>*;x91=E>t>ydD-E;bP#$F z5>c33Ns2$%z%?>Jo)|2zjpQS3WUy4UAA z)H&l;`Ba^Hs$M;5$9bLdDad@gDyJLKpx4dfFs6Q5=tLn9R)|Gi(5Q7;=ixJIAk`76{w2x&Y=z0bsw97kh_Fg3Fp!!`1%{B-2+9o> zO^0#;LV8B{q;%)~fW=xYbmLE=sqz$%^ z2xR*D%we`P7_=x7!v1NwIz)qDSe62hMHwS+APyteEeqoa-zHI|@e%gPZTKb>Szyz{p^y z1uJE5_Tumg>M`8}+1*o5tJECYsY+#U@D8lirXvafE%pRs&uni4hU>9N7$e#s1mHsF z+Nx$7O_=hXtksO$ig6Hgzb>VxIKDO0zdp&mHtv!+_=w(Xv-0Ez@&j+AZToHVwm;~7 zw{*2NO4T0RrgR{|a`2>c&oId>osf-fI}pN%BSDuaY{rine^&`;<3-z64M_{71GASp zf~X=SI-3hY-ndPt^)5f^mDCl>vY0@^F9j~tzc|^qBT>@)}s7 zXeA28w^M7%D}E}SQ6nd>r6)faI( zgY^~2Xs~zNadV{U<}k!+WQ#a+>qeXDc9-qeU_IRFEew7lacwov*6F6I@(1ECOxG4; z=>_&Xq2w1N>P;ZpSxf8EJ8Ee4VVe~z@v&|O%hX3Jm4juOecF_+!szC#fcn&{)v*^X zp+}7&$I7lBR9)SwJo|C#j;Bg4eAwOIBw7uBVtLDG7m4}g(E}pSq~w#g>jFHQZsD1) zCI2ZM49e$*06*?UFp(yj@=h+4s|ZM&NF(YRS>i)N$%QhVMlO_XOt?@oLD*hV;#FB; zf;aw0xKqw+$eoh6g*&C}6cDmLihKI5^M1vink5vSl_DBam{p%}6yZqhshYfr8qlFy zw3DV<^|NRy_24{0<5VN|_Za8U7TUUaze<_IoyYa4Fj*!n(zQFXJk@>ak7_CVcD zOxgF~5Q2)ChSF(^Vz@ABNbXHTYgi716b8f%k0IhB#Ugse%_f@iZNlCz9ZoeEBWf+D zN1fD>AKiwlII&He(W1?$&yTevd6fq3FZS4|IQBvEx(9kYTKO<~r+9u@&LU*7T=wx{ z?`(V&`9$-GlTY+#oW@7^x$+k-;qSmtbmYabnN$VRY1yzpDD5RKjp*#`NG&%7Ig6n} z0z4>OD9Q(s#lQrM6MX?6tk9=0!3Xw;Z*h3^2h^xJG^tWv!`W%LKv9eYOXpgM4GR<$ zvBi`+`^KU)TS3aWO@SFDM8Wau-0_-Xk~Vc1XV4dHEuHU%(igAQGacn*g>a;Rjqq!} zF@}b1Ed&;56Cxts?5f83TNvV9#A0sr^jnNGwd$#=ypfWa?y%j|n#bxAn$o6jB28%n zLb6u}($V=Q%L~mJPychn5 z-6<|9uYoVs;4h?I*NE(tcpb`%M2*3bmVzRkcStHJDM3X{?$V`CI*O5qPJ&CT&Yy0A zK(v(UP|W#}FJ0(1&$PlW%jSDQ!B8v&epq06a}-KZFlunBEwtYPbp=XBoO}nqwAD1% zWSDhmra+PF(wg1gUuZ+HtRobGoYd=T)!EQTg6Atj%pey1)H4a-AeL~S zI@^_nq7X#9gQZ<9PVg;C^eKq(MV-Rk|i%;%&MSTzFrGbd%UJ#8V6$owl1tcFi$s^5U<^3n(eBXZPhRIR02ZU zgD`>(GA*}8TW*ZCF7}vtpts>huXVA@dIR)#yJ?}-INN~n>(c3(l8N%H{xpxl9QPZ2 zXl3v)FieobAwnrFQ$SHM-)_SW%efluj7>9XH%ztICR%M+lrUCr9I4R_*@`eL)1^;o z%nh=}ozr=4#>s_gTOLVW{mrh%Iy!DwLXNt9>^5n&h*a~rJSR2ZCF7$OE|V`r4)gK! zbhf#U@Z)A2wvI@OCOW8q!NW;}c-&bOL&Jj0Qy8uyBqGL@g$ln&Sxhq3@`PXF)xty{ zm|sDH7p%||ND_oF#3WxNscffGnaC+DQ8ujG4@X`@w&+yvbG=UqDuSXxk^MMn{CrC^j0klV1tYuR*2pBi=%|%%^@gA ztI$P4j&p;&sBNLG5@(UjHR)&S;Twx5P4W>{e0SW58(8&BT`JaRP(x7|B8(DCFUXzF zHJavHtkWHskEzC#?*z_Yc9f0UN(QU)`%Utmvb5$r9I|}L;IlP%@AGM&-52xL-!xUI zn`&@;1ZnT!Gdba;f=}d}%vsYVBHvQxxy<;OKg*%xR=IvhSKO7qNTNbk*K-L0{E{Fr z6I1gr2_n+C3KRlgN?}|f5D6yZCtPSTTxcS>Pyk18EVsBd(zMtM618%%-8A1)f#u9I4()Vx;UvbObcr32 zhZZ|5=t*Ip5H~cy1MpS_q&Ap@>Tj5%?KAed4yaP=XWFe8u0W-a)fbq*8L%h^44K{9 zcROanV_37;~cg4Vi##(xIMd zgzm3s5=m*hks$1DpHNf$9e4Y9n6+rgl-pmP(NmJxstC3xyP5oV79M^fYvX;1@BTO4<+aU@ zN|)J5Be)dvV0I;ZAdkeEiL=Kf6)%;2ti_hjcR}%o7NB&7s}%o4{wc*jq3dOJy-Qcf zx-=J;E$~BWMese9=ELvDhBWXVq-8YNkay-(w{d zDV>4FsrJ?gHgM5-Ohl)Rz`+`nHImh{XzQh)mOP;|YyJ3>rcS*J7D#GSA@fyIS>xtq5cIgXNh6rKvr|2_1^y zx+J&CfL-d-Z_Bs;Drvn|{c7 z((XdCKUQQ*XSfP2j5B}9qhV{O{js!{L`{-36onkMla`1yPGP8!zX}(M@&Pch@AN8& z^8|dbLU%@yzQr}7s4)a(Lw_0BX$hw`l%R5IBP<aO%B8s==7qfK=H6RXa`icMwOW#kh{?j zMjPBIs&)8M!z^_BwW?{f9?dxjhn+D;=8@^Z8~4Bv9VC&$Ux&CxXiBNY(M&ClCi8rY zdAgx=5@e}0f6SaW3>r2f-k( z6A`jAt{Ik$Pl%VC%%|i$)fv)sF6xIOR~MJ`V@^>o@&>WHiPmqy43Jxh62hgZpe!xaH%cqLQ#vJVtN=F;?NZW z!b!V&!mdI%ggIhxehNpLqcsmti1;VOzP;76j(oIy=aI|wqd`GRL!_gG;s_sahtw36 z{t%XqHqEt`(htx9_f_-l6|;@H8LY&xDkm)2W2I?*S>6-o3~;RrNL>4<6ajvchz1Qs zDjea5Yv=0A=9lfcX!3}=MZ{K%?OIOdnK-VMBcG&ySw?Jl^ z&yi-#BvD#MF!0l&if5V(?T2L{kW!fCF0>%l1Mtc6qpv8V-SG!_RiG$p3?!@ooQXHC z6qC_YL?1)gVh}PVfg)t!^~#tLlxtQc;veh}hRC*9in~Tfns-H_QxE$U*&h$&I~d@GfYP$@378|PaMNJ?iggHb7;Fl7#_ zVuy<(=G!16u7WQm%9{jHtb>9km`xB6&exaCphm>uh1UEDOa2%VT0`bwSvrTVwasAF(7+wP#g{%4&Js5Vk1jQ$msT8KN5{ac>BX){L-WOYW!*C1Bw=;fGkLnr@(j zS1~w0(`=YURSr1}b>wk&Cu`Jt?I;Q-t1`JqflLIg-Nu{npJa<@(}QQB#sx04f=STU zq?t!GiMg5PQWzq-$J0ofDs#sSX@doU6eb~eqi`q`r?i+9(r=Xc+&Ba?S3XlyGHpX1 zls{q48#Bs>%Q6P(z=OmtWq5n;_4;HFOTZ4znfK+NKa%*i%n)(PZq`UmcCiJ<8S@~t zB;=&|6+@mIXgleu96Ab!nM+v_+yog|uFa{3XrF!m#~OF9NKm zNMSg}v8R+mpui6nC{spWCPNe`E=z5MEuw@JtPPU_uAU-$)a1b4^30LyLb%ZJYCu>t zjd}T|GEg%!xN$AzkQ2^gk1yNbT(6ZR+ad(^TBj=0W}5X2gXrs0GKqBN7EVDQ#-cTB z3?c^$uu)VjV#=u#YYjDXE#-49hH1<|!9~{=z!0%XZ>T72rd|yOU;%4nS-sEG7u@LQ z_C1kv&BnQU-4xboROOH1l*_U#SmBU1wZAyFJ1?|T5!{sKV+%W6>b53t+pkjI|8J^O z@7b$LdBYVqX-R5^L+B{mbS9jnyoQn;%1^HOh<1@^Phvhv#VaICOrCKIo+K1;BWsc|)C##hZy-~arYcIumQp~4`-N4w$hd0wuK5Z?Wv?wRpk&c#U4e3$`GzmS0 z(VfcB){JY8m@^gLn~L|pn7Zm;vOoQPeN_dW$iXC;R4S0#Q&LON$;K%7q@Jy4yEAR= zl<+chP2f3)0;QFAk{nyA-!Y)O%zsk-2mIK70zavj3nH6RP$tftDNLLvTqxs*4Cab5 z>M}zZc_|MN;=;G0uTW4V6sb}atPPQXB5qJGR;C3FTa_c$0ze2CiVG_bP!vMw zFonB@)%1;JSW7vLa7cq^WP)=&)F52!t3d(@rOaZNWn3GM4Y0&*k`>a$Q4lT^7?V(+ zy2Lo4qRlV^t`+K2NAV0nh(&oyP~PJeX%m$>C_faQRlx7U+(+AXvz4;L^#P;lf`nXHhp#9o&E3($#75}o#p)0bLI_m_4 zJ<3)%VIjdFS)R}g3eCiF&Xe|vIKdOz1_Sv|$@sWEK$HlPlr-1k)G~4Xu++#U6C{q4 zQ&5x;oWc{@)#G*?a}4}+Q%!&kbSRQQ{S3HGRD>Os3os^_6b(+m9I3}dJ$h)@TJ#f! z1mrIWfj|*D3_u7S4T(!pjes9VA_}=ibLkBBDb%Z{AOi=1=O~!2R!*VxwC0Ula*(V- zv2hD6Dys1rKiVx@i$I7jBUzzCH;v=a;qXgS#td1*rD=e0P?OwS5Y?R@!M@bn9(AhR zeT{P0?~>k>nIhe6hC-Tw)zH{GntY(Dk*x@~$>3qai!4vOn}-5OHkV=8%C%W|hK^Mk^AAb&(U+JmfFXrb6LAj%^vnv=MDQr2dN? z6-?7$Lf=j!Q6x--&Y!Khy>hO_IOWhx;!t}OKV}688l3+#T#++Wp53QUhbE&_iQ~0= z?eXV~J{xenR{C4A8dV-Gl4MO66cThvrGnII7wfbnwwinHY<$bgKI*Cp<74KUhK(c% z6H6!vKf!-4wIBoq%3TP;4~+i~a)FwCL zQf}lWdE{kWiYT|-X!pE0Pi4H9GRnQBBw@HRceJ{A9A_aRbE(%()*%bkPu1zC8p@`c zj8n)(ThNrKq@9KkI58_S^$Cur`wNN@<+|NL*+R`6*+_DSvZ%nU4FeG$)hTGpZf4i>F>!b z@tzhOU#}box&xepD}9krGdVAM#K(Kbbu2d|t!_Mfe3^nG=2ve$|+GwOJn4s*G$=gg48B zn=%6&NuK4A7n_RWhb%dih1xYxNl!JPP%}^p1Muog>5t7uIMSI`@YM;S(hDoIKK_?-k6qUC5?6a&I*MG%Hi;@@ z@LYn4SgGN_o|BA^z!POVwf*jxMS`x3ia!DmeRaWKGk+rLci>0SN(3*#V!KLs7+)S` zF>ZOlFADgvfS`>_*l-2&9HP;(fB7M6r|TCI&Ektowm;Fn<@{yI{-_FsM?}6!C|=B!@Vg)n zzo-a1C(8~!D-StSn;Ftyp3`SikXWcfL3*JI1&-$!#Nmw<@_u9PkhNgMRybCpnt&v? z$uQYm0pptnkfhtOp~ zBZBoZP;(=hbfEb+*A5A`wqJQ=pztbnIaO=u*0iV^AR0#ho>Jd|a^g=V@>MZQ_fv{4ZX!YVsuT#GHc|dlv&MBH?7suGDbg znt?a^P}_ZJkdv4fI8Po#qW-OuJd=`7fJZGrkeX5pN#G}y@UTL%JY^)R2Exx}f50y{ z?3@CzurndNSC`gTk=s+2)1^!6gkG;8x)n!ka-KNv7)N{Hm@-aeFw}zcK4?G!UbGGUAS5!JXiy=+j3{L>4XEGeTXj@p z43dG;kKv9ZiESxG6dcw^bj0qQu;ShNA$69q$7r;epN(k z@=275v(04-l+>Wir)f9jGL)lIlf=UODuyfYOQ4G^28u{(#<6~i!eQ26X==YFu{$rU zJ;SFi`iKb-?sz!k!@o=Y=$ok@eZS)NsJy{n=Em?#5*e<#ESXm;D##?AFpYJeH ztfliu$PlH+g4I*VjHVoFN=nI#%E6b87_*1U(+Bj)y+tvd@@ws>UiEP&Ou_xvjJ z({E&a_QTAL_ouA<*Yaqu@`5B`b~NX}n_pP2z-}{#c7%wqCmIgIa|#Gai%UHRcAgMV zNSO-_LXhh7j^u^0b4TXDb6Xs*gRN zx8otju7|R>J&?BgTk@@snToTy$m2SXn?yL^Lqd)hp)CWCN8q{VC(;&7P?I{IX*13| zos|QOkNfYU|9406Cpx%X`3VNwi67-Jx#5?V<3|woR%8Re0doNsl?`J80qTTmbuTJk zvyvm94$0?a9Y#Bm!cYU?+G0Lz+b)k7jR*RG#~^t)L<(*W03JW-Q3UYXUG?>lBp zm}!784h#i88@hoDdEHM5O+2yI}F)adUpQ*>;%K!!>X+EG`a z<)j!jq>boP2X%>q+QfcUTwh5{Pkwl}GNditry=QLb?}bzOCM-Yyj*zjY5C6kGd}xX z^85c#7VT4}gh)x4os_KzG2ilnkJT;`cpUl2ZIXVF+eSivP5LtupHcHqB%eZiwk&xe zYDLMGC-@e^kLm}3AH_dppe_?62$90{oAcl>fge_Pj@GDp%QErDv1-C^5|a$5A7Ern z#z|2&VBoghGDYWimUeiK^`W;%j~Rp3~6AS+j@B z;s!P0y#?3WQ%*O8ZD>k5Gik}5sV$ss(9U5;dkcUxEWoLvqUbQ=bRbk6(@-bd^2V{j z)|fd`nmVYC>no1wRfhH!gmx+8Ft;=Io_ zKPS%3dUKO|HpNc7H}^Wpb-YQuDYmor+OaLiHL=`eOOYk3T9#2o0wj7HV1|KV8dI3c zPzHvXp_l2sG6O>y7do&WaveMpXX&$)Zf?|f(YK=>R#Jn#Fw<@dg+Pj!C& zQ~lq*+n4f(ptbd$&TJ1YK5S!`7>?Qi-z+^J}t`F8cvLEAS)y zyO%k;*FOR0w{1M{<*(`d8J%V!@!$RU;l6(Pzwjdvu0?t`2F+K7Q8RL09dW@UqD}8c z+=D|Xh{%tYn%I1FYchO$aR}lQEF@ZVcHlNlC^}Q-2WU94v2K)1z(ZyWqtxihl=Ka3 zviFl@zlb88qPJ(^`U^mX{~IBR7`VVCgd*WPv%cFS-M5C??+`9xT0Sy9o=se@8R@wm z(O-dhajTZw3vZ0{T^lg0yOb*?{-UvHQgwQWvoqOQdMEDKnsD5i@}O4=CH}v|CNK2k ziPmotoZzP8i1`*NG`6k#bZZuXr(EupE_U#j&B~;yW}#a=W2l&DEF4yxiB^B=Wqn{y zd#>xmV}^YX>vnxJ)KTy4M1`Gpc=xZ0(GKq`=8=GbHk*hUz9w4;c-vtgZ8`5Z57H=- z%nO~ozLz{B!2=!nAyWnlB4tMBU*P{r{xkf(g3xqz*l~5laft{S>-AyqFK}}V$rn_4 zVCDLO8LTLV>~7-f?92d(|B#3w_yIZWsvCeg-I~X+ijliOF^Or02h=h3Q?(;^KQb%j^Rzmwf>fMuV&3A zUC^do_BUP*x2&40myC=l^~n+b2hp+@?;_7PX1zOMzl;9WY2V%105Pg4Sfa8&7utlJ zK~v9Q*R}rE4Nv`wMYh<%n>UotXme)`ti?WY(j;5x5KikDV|5o}vQvSI-PVj3dQu*5 zJNU4E&p+FkhkbpG|4=LRfEPN{L!S$s>coYW?f&=sJ-eifb35mW%l~6P{~>4ABfVEg?3V{EYyGB;0oxVq`5S}tL)eG1 zZFCDe<7RPV7R(#Kc+V|N0-3{2T_nKulwqg9qeh%=~(4^{tHj6bXTI3u@$#K&E6e%q5+%;oVg$= z8slotv=6n8n}eNKg8EAqd9tT^-oTttok_@!&+3X-?3xu<<5I75riGbk$ce(1R_%4< zz1Dm3@%Ez+w;g)4}Q{f&Y!8ux{-K+^Hbi_pI`Ta_Y^72=H(cUbv4v;CFZ=I2;WSE zZ;iu<0XaZ5usIXGJr%iy{bN&6z)8=hgA456oF({Ss>CKBM7u3EST7PGbC;9|03m6^ zC2K%&{~d>nKfuN;FcKY5WIh7je1<#@%pE8gf)(AGCMt%+h0{o&TW<`s+#Kn?Jz>2S z@4Yo@vYV3-?^$TgTeiw(TXN%)1O3d`JtrT&InZ-E*0DL%y){Ps z;+;t^1P=7=-Feag2SW;9c-hmqVv;PiRn9bIP1k46cW`h4c+IO@^R_JZN@k3lcOoqR#@0Td+Sg#>>+2pbST{O9-)LrNldxWI7l)gjOIVZ;w` zdk7Mu*fT~B#+Xe)xeVT>cOKyo^q7HA;b}4&crr&^b>IfhEI@9 zpycu&y+#W&oyf#P($_>rcOjQOPn%GjX>>Oso#rO#7^FrMw%g-KN$amibhpNOZw@0P zW4s)w-|%ZL*`&!{?t-x>&UrndI5OWOn9!Ua;eQm&erkxj3t8{2;T}}>x5jLM5P4TL z-4I0zLyAsGSW$<1rAN46ET3!2Uowf4j=B|R{jyD+w8$4a1k=sMadmpE`ba-#uczou zd-lt{XP@ji{;$SQzU`0~l2n;dY^QA|J@bXmv;2d3_rRmOJwd*EJ@X{tc`s%M`RF#Y z?XVArjvTft52TBNEUym8TCDAAP`mC^ zU9yRnO}wQJ_KfzzF#FGg%s`tiTj}7=8yL$LS<)&?nrjw8${z7TpLo{DnQAT?Q>PE|4+YA1`4~H$1+SaV zJ>7lk@z!IHnbKZJw5mtys|Ol{ZuI8r(Vi=^;pnSvdV$R#BxX}5FgFX#IvzRATodj* z;GoEZgNBKQ%D%?R-UghCzWNHp>?CYQP0Vl}L7yyIkBXELzu%g(4ODG6B68i~Jg9T;umt;Q(CQLxoY|X^( z%%MphofB|)WY-y3i2U{T4%cliZV#ovG9R+lfP^9tqEIfRJ7x=4q9#4Ji7!Mm09={{ zQQ(b%4xqU1Rb37?UWw@84p%I~RjX*Jt76_zG*zEEQ1)^#;}??##;|a&^&l0=e&u?k zbHiPWBq}P&xM_?M@oiK&2GP5wyX4$e}KV5wWMU}Vp?a^{Sz zam|GhY04n~aD=nhSNe`K_Z3U}AN$V!z9Z%5`hEWrGs+^(yjUY|u#q3FJAxs_vr9?7ByZG=P8Gu}V|c}dUC3`MimCMh z+qKaEAjEFJ&8Y#hsu2**(8>iDf(S@7Y!gtSW$4Qb@WLx<{OYTBT(QI?pf`O6j5iJ;*3vCs1dd75f z;b_f?;p$^C(Wg<~CqCwT?!q^%IWL*ge&2QKNyGl{d+REEb>+TVrni=bXSj|X(v$^N zC84^CP<=&zEi0@k58%|Yg7xL$I$*{Ms>*_D{0uXsDG%1NBXyNw4JS~`3D@!a)s>;@ zqM*2FP+T%7VZ;=y0cCka!Rl9(`Kt50ic+tvG$>^Z*73uNa-Wjvk(K)8W&Y|Sue>y> zs*Gv)gDOr`Qbt{k2Z7)9arC?ZDqP}1qM5irkPHJ{$Rs-8N{C1RCe+0H?Slzfb8vyE z$&DhSpoI+ae+Vr|c5T}ik~RpmB++YlX;A|fVx<;|`pM{6Xi-vThwMRG-l7%rH}J>4>MjIVf-<{dw*7QcBz}Y z07MOp*_MK-hU|nobxeJJRB>t$zOZtyuk39v^LR`@lXa6?t3zA{qJiD(7BdQPy3A8ZnYn#GY8 zX@3(hqLV~g#Nif6ST7A>9_fvV2sVt}nnv3h^b0{{i+1TEXLkmPfy-#zel_eOS^=G95{{aSD4_3 z>OVvyIypwoH<1a8b&*{NgYDM_fS>VlxOF4cwCb+C-?il_04yY6bJ87ZF2PQ@j&aJ84S z+{vET7tc0jPt~PO)TQGj>eAvggu~)vk*a-w&{y`3r|>OD)=Q?0|J9TFjA7p+_`m5_ zm-&I8y3{4jcB_i*l1!I8Z1%X4kAT$iHAT9ezyIc5=GFpINH{Iizo47)VjB`R;kY@_Ui@VHf7K#r*6$)6TkqNhj@U%LwiA(M>5r#Y@vqCK_?laz!)4J z9cF-bKpLKMaFhN?;EKE`HWQF3p!A9fOid$~G|>_dD@tbkz!!poMBRKrx{{FoCe;km zCA>Bq;f61d+wn>+5vZX%ZbW2`B zb8@0Sb+SG+QI|R<|1`pSGnDtN{UBv}kFuY9Q1>e;QE_VBDp@y+*R8U3oAgpI4+j~5 zWJg)DwRF)?GTV4zx-NZEeKw&!14lTeEgY*&AE`-+2_a{82g^SQmVfBUdDWS{!=CqQ z-H73(ZPuK=Y^J#|(U3K!IX^5rF)TV3#v-_A;+=!bbjeGc$}*Rd4ehoJbP5G}^I^ zY|(4u;2Lj^2T7z4nnH`xLS_?#v8Ld_2y)xJB*S+hYUWXyBXWk6nJ`wH9!Cfw-qWJ+ zh#)0iVw2C($QMgUr6MOzH|+yIw3nf=g+y<_5021sZ4j${yRJpsuS8lehmGqY!&*QK zFSz26CvEZ-i)f*TH`~gX(dA6kpBt^-Gb;XgM7U>I@X=uTUxVqtbbdnhzDl*dNEx1{ z1Qa#SJDTidC);5;tCo?AK~T{vTx?}8wsYom`SZH`Ib+$Jp?tQ5k*L2ou1O!2oq#VK z;Qp9ET(q z-q9|}b}Nc~8jiEJ+*Ml+6v0b(J;&d~_iOo1Rhh4e8-hpFSNmJUzGi`|fkWM%AKhGt zZ!Y3aI`&i{JRpW~6D-7@l`$WwS3vB5h)^_$3o)~tSWz(b9^NFcy^S0_XJY&Oo#eR3 z$f9z@70@#DK5Wt=iF{iV1%SJK4yHS&DT!hl}l*NZ((d}?!HY;%z$ z#=xgLi(^}habhj8f^#~GomIESLr8f;l#-|s)C9CNBfoNraDjIasw1O@14oEigg|R4 zj=M#~7p{^4p%}^p=7F7Lt`91R$q@wg2nPxO#!!eL#dMGlxAjR$J%XY{+Z9{_?Qh!% zv~2jaYu<)cZ^N=vnKX+QyQ>xqCG(w}`F7@{_QHhv6cp*G_!CfYpzMuM#*^X9r+lY> z+vQoqaf54@1fcAwX1?dKD!> zH7g)5_Q@F}au8)ZBsn(Td57SFnRCKimFkjYA>aeDa;0Hwt!2+8} zr)Kaa2`b2!kTw&T=mTiM#k-i!gbPO~{R2YMr0clPKS0=h1y%K6>(&0Y%Mn1RLoB~+ zQ>>sgZ<8Y>w$KeP$U@80OiRIp_ClgQEus88UUMie`wVeK|Hc35KmGl{$sc+SJOEqT z{3xZO9^g|{E=76kvIeTpuC`aMbcvSQcniAXd7KvH2TB$U%(>?LsoL~}EM-)9WJGXa zkh^z)yKjKIKg@jJU-+gs_cae<{Iq9HCw}FY^OIeY-I@2YE zk<53AF8W|0WrcWS=BDBh*yP1vs-rs7F1%Q>#bfRF3%-baJwTOa7DTo+uRrc%U1j4(pqD$i#(Q*f< zEWx6p7J+cWe}gn$_|f|WcL?&`O5ncBFfwq&kdn|IJ06K5MMVNbUWnxcP7pF+9=&yk z1`-ewX+sbtWF@UMBoLeo;?B_~0ts{##{nU_l6pbGt4L#FyC{y|a5-pP_cpD%G%I#A zMu?z77kgkud2_9$bNc+r#*E4O^o06!TzYs^1Yh`ZjJ-3G`>g-WkNqdU@7+)JzD70w zfU2P=7DXxE`h#6?qNn75n{{wrb9%8cZ=t0WbeyZpnbl-WsnRBEPK{L`jtdTq3Xcx+ zJ{jVD97SAM`qvQStw7=HzPz{GS$}q9ykJg$&WT`vpALH%RFnpYk<4|AvLHcif;0>N zJi{XW| zA`H}5`5U-i7|ccijuUYwbQ5TYqZfmJpeBT9&>#sJWnrVb->9OtNQG}4_VdnCVhe_J zX>1EIJL-jr&@I%Mz(PF70;m^)f3#CXUTs^N4&PahZ_$Yu#1eNgHFVo}l9es+c_`MC z)C|Folq|@|b2JBkiSPsU4fGJBA8Eu+t~%htQLOKJxcyqB<4U;WDl(km)^)FT-J`v< zjh|Tx2^Vc>EFc8`)ThUlpN)$54OP8ARIzig}ET_7{Uti^|=eTRj5z*s=L&@+qRQccw0iLef19NJS0L!4ECTvvpw<&`98fq(v z`A7g@lCTgcVk11NyAxqzMPWQAP`ezI7NJGyaZJdsk|`p%ZR8>NMY?ZBdvJ3T_VY^6fUdH2pMK2)|EFDb zsF%&MWs@XHC|JGF$(z>~&FKrLbvaXw7bfb?jjKK%lYbT$?T=NwJ;>M*&3QhY@kHS0 zL%u@~I6tPko}=n$EpzhQlvkBzF4-3oo_vlrs$K8=&VAzD$i=@7<^FlN;FY1g7e|?I zk8<|L1qX+@`-iIbN15;T=k5sQ?g-|*9LU+>&3xIN_JS?_S;$3m`4KB8#l}m6!?SQt zn=4LOs!p1#&RDr;U6MSPG#{4MCo2xf7(PX@S6&31Tu8e>Nvg|`qwx~*75R}wZRElK zc{LS;c5sTSazFG-EgKL9w0s|wOMNBi=+_DWWI$Wx*Fl03`w0krI$_9&)LKobRT6Gf zgN66;TbbBeN?;>AEF=MsI6}HukKD~f|Lp|YERaDZ;1Mk8JRHe}PY(i^yUTERXsX|) z9psPAf3jZ)#U>`@NW|N6iw=+>eQ(C&)A{*M=h3%apS}@JeIuIn z%3$tGvHVw~na@TtpABXF&Y${(|J)OSwBH3T{KVw4XURlyc96ivt=^|kPk z=kx1?VWT|U2181;41JOb=o;8kVl#12pg_OVM2MhBd?8)$ogYF%4j*pK#z<)i37u)o zbi$2J{07o5^W_TJ9r)!cAOxa-la46xEqKitG}y;BCvfpIh<;++D#Z;4ctNM-d%9*!RK1&d*<_DC)mZROWXd)cpFt z_I~(d(?|au?|XLsp!?NFdUrqL`0(E&Xa5J_cYjQ|4?pDn>|yV*A3Bdd;yC<+zP;aR zeV@|3PuVL{9Ks8hij*GKArm*Xx8l>Diep`@gT0va%{tg!`f(R?zlC?sDo8_i#v)9& zinDFTANS>X1PeGAg2-b&-x*3bZ5mAt(e4%M+VP7*fn8N6XXw#tT#s z38-{{Pgj6RLWiUR@K2ynAV(8)v3KlC)F>8VSJ9m|{r5}QiHvj_1nM|#LPv>K0))VC z+HX z;M26@K#K-|8NvpwFwjy12}6j8(855ps9(qLhlBxydPTHD)87Uyqm0rJP7(>TG!8Ea zQ9}yx#M_~2Ps;JIq6ATJ4!&>><-^#m`BC5p9ZM&4pk_fnY?>Rpo5cED6y>MBz%w~P zo)9=7<;nyRGJp`abZ&SH%pS)$Ezb>H^&Z4Tt=_Bs-IsCU*4uK)QoC%bS?b`SF>s-^ zig>=}f|=&LsivH1)wwaz!9?}Jap8eD@1uCtt`XK-L#3|`)vQ*Ks40jGGX~02f(3h>nY+yAUTxd|qmGovZPnSPisNv8 zy;Z0BSjRh9`+C@)c9$PCbI$@fEBCaiG6mnY@Xnk0X?SB1q}yRR1?di?Y~+P5MVUuc zhC&1h1nVkE%tu#|;QU}hkwSxV34(k&k*`?_pBHG6`E+8qJ%|^W(0-#D%!`_uqUPpk zPeaI{=!YSt?I#hXcZe^HlbC%nLi;&VroRO%3j9ccca(G>0$`*9mc}=MB4AsYgc<^J zckx_;=G;bZ8m*ElA=GQ|rl=c~Z|BM@Bn@wUB`D#-RCXxO2mATyyI#xtmw) z^=OO-esc!Y5K3qDr87-AlgiT*%G2Z0PbX?VkMsAAa^8=#--+cvH<#gGQh(F?7S;C0M-%PJ*>=TL12--!91>;(%a6J8_x2q7 zb=%P&_i<7z+_OC}o)t%7PTNcNbg~b&Gj?|{cEOy2jwUupNsfh=X5ytmsrJE5@=~p$ zOfb>~fuk%%SrMfr)Q|jniBBu=H=roU3+g3NqtXk4qHt(Xz*GiwHGvknzquL?ufMYv zKM*!5!maXXZ$qS~p}$p)xG>UA%Nb%qVN0P%R}x#vQM$B?>iiHgGDNvd4-ylKGe1fw zI3LG{t)&Uj_YRl`s*xxHZf};@&$T%`@2Zw`ms$OX0&g;u(nzE-GvnEyN5|YE?;zMJi!=v1fMl0SM zVg6+>|HXmSpM*dE=g=W4@Mo(2JJb^t_1@2^N!BY#UCvUsaMe-2=GU({>XLn`q(zy; zh@c+XVyAenl{=;9BpOPBj1Mdy|Il{$mq|}Mu86KVw8>711!)SdlueeO#H_^VTQ$(h7|g=BW(pO-SdyGBdj7%JK^aPg_o@&D%DO_`piB;Tg~1he_8 z?~HSHUA71|0(!J*uX~#>xf)i{Z|`inVt^8?SMM6^$VSi%( z>~Y(^M;FZvmxJx=uBMe<*=#d&Or9Dnc-?mV(WVzD*^`e%3XY8OvPT7(5$>5F^JwSM zUl=mp>?-@%%z^VeWvMz1b=t<*(^ Bella The Dragon - Original Edition

Upper left Corner Image
Lower Left Corner Image
Upper Right Corner Image
Lower Right Corner Image
Middle Left Image
Middle Right Image
Story Picture
Bella The Dragon
written by
Barbara Nick
illustrated by
Elaine Steckler
Copyright © Catto Creations, 2000-2013. All rights reserved.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella1.xhtml b/readium/navigators/web/scripts/OEBPS/bella1.xhtml new file mode 100644 index 0000000000..1b203051f2 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella1.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
Once in a land not so far away ...
and
a time not so long ago ...
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella10.xhtml b/readium/navigators/web/scripts/OEBPS/bella10.xhtml new file mode 100644 index 0000000000..46c4b24108 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella10.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
Bella, weak and weary
without the strength of
the sparkling jeweled scales,
slithered slowly to the
waters edge and sank ...
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella11.xhtml b/readium/navigators/web/scripts/OEBPS/bella11.xhtml new file mode 100644 index 0000000000..c25f395750 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella11.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
DEEP
DEEP
DEEP
to the cold, brown bottom.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella12.xhtml b/readium/navigators/web/scripts/OEBPS/bella12.xhtml new file mode 100644 index 0000000000..c39fcd8f24 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella12.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
Bella tried and tried to swim
to the surface to tell the
children not to worry.
Without the jeweled scales,
Bella could not swim.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella13.xhtml b/readium/navigators/web/scripts/OEBPS/bella13.xhtml new file mode 100644 index 0000000000..d58a635420 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella13.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
Bella the Dragon lay all alone
on the ocean floor ...
motionless and helpless.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella14.xhtml b/readium/navigators/web/scripts/OEBPS/bella14.xhtml new file mode 100644 index 0000000000..67cc48b3bd --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella14.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
The next day appeared
bright and sunny.
The children looked for Bella,
but their dragon was gone.
They were very sad.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella15.xhtml b/readium/navigators/web/scripts/OEBPS/bella15.xhtml new file mode 100644 index 0000000000..6480ce14d1 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella15.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Diving off Bella's Nose
Sliding down Bella's Tail
Swimming in the water
They missed
diving off
Bella's nose,
sliding down
Bella's tail,
and swimming where
Bella warmed the
clear blue water
with fire breath.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella16.xhtml b/readium/navigators/web/scripts/OEBPS/bella16.xhtml new file mode 100644 index 0000000000..c135c09e6e --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella16.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Flying on Bella's back
They missed flying
UP
UP
UP
and all around on Bella's back.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella17.xhtml b/readium/navigators/web/scripts/OEBPS/bella17.xhtml new file mode 100644 index 0000000000..184fc9a07d --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella17.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
The memories of Bella made them happy,
but they missed their dragon very
much. Every day the children walked
to the water's edge and thought
of Bella. Their tears of sadness
splashed in the salty water and
drifted far out to sea.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella18.xhtml b/readium/navigators/web/scripts/OEBPS/bella18.xhtml new file mode 100644 index 0000000000..33c39201c2 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella18.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
They somehow knew that Bella understood
their sadness. Bella was at the bottom of the
brown sandy water, but the children's love
reached that far and that deep. Each tear
and each thought brought Bella strength.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella19.xhtml b/readium/navigators/web/scripts/OEBPS/bella19.xhtml new file mode 100644 index 0000000000..ec2601b557 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella19.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
Their hearts touched Bella's heart
and SLOWLY ...
very SLOWLY ...
Bella's jeweled scales grew back
one by one.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella2.xhtml b/readium/navigators/web/scripts/OEBPS/bella2.xhtml new file mode 100644 index 0000000000..987a06a4a2 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella2.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
There lived a beautiful
kind, friendly dragon,
named Bella.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella20.xhtml b/readium/navigators/web/scripts/OEBPS/bella20.xhtml new file mode 100644 index 0000000000..3c0b79b133 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella20.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
Then one happy day, the
children saw their dragon.
At first they saw a magical
golden shimmer in the distance.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella21.xhtml b/readium/navigators/web/scripts/OEBPS/bella21.xhtml new file mode 100644 index 0000000000..52acb5c731 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella21.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Bella's Tail
Then, as Bella flew closer, they saw
Passionate purple amethyst
Icy blue aquamarine
Deep sea green emeralds
Translucent pearls
Fiery red rubies
Limey green peridot
Cold blue sapphires
Sunny yellow amber
Earthy blue turquoise
and brilliantly
Rainbow-colored diamonds.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella22.xhtml b/readium/navigators/web/scripts/OEBPS/bella22.xhtml new file mode 100644 index 0000000000..dc3726e016 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella22.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
The children ran to Bella.
They hugged Bella
and they hugged each other.
Friends happy to be together.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella3.xhtml b/readium/navigators/web/scripts/OEBPS/bella3.xhtml new file mode 100644 index 0000000000..30687a20e4 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella3.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
All the children loved Bella. They played
with Bella from sunrise to sunset every day.
The children loved to dive off Bella's nose,
slide down Bella's tail, and swim where Bella
warmed the clear blue water with fire breath.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella4.xhtml b/readium/navigators/web/scripts/OEBPS/bella4.xhtml new file mode 100644 index 0000000000..e0cf3eb91f --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella4.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
They loved to fly
UP
UP
UP
and all around on Bella's back.
They were very happy.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella5.xhtml b/readium/navigators/web/scripts/OEBPS/bella5.xhtml new file mode 100644 index 0000000000..3cb0898991 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella5.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
Bella was a special Dragon
with scales made of precious gems
that shimmered and sparkled
in the sun.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella6.xhtml b/readium/navigators/web/scripts/OEBPS/bella6.xhtml new file mode 100644 index 0000000000..be0a5c7533 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella6.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
The glittering jeweled scales
made Bella strong because
they were bright, shiny,
and full of light.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella7.xhtml b/readium/navigators/web/scripts/OEBPS/bella7.xhtml new file mode 100644 index 0000000000..ab8deace6f --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella7.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
Bella's scales were made of
Passionate purple amethyst
Icy blue aquamarine
Deep sea green emeralds
Translucent pearls
Fiery red rubies
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella8.xhtml b/readium/navigators/web/scripts/OEBPS/bella8.xhtml new file mode 100644 index 0000000000..4081e4dea6 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella8.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
Limey green peridot
Cold blue sapphires
Sunny yellow amber
Earthy blue turquoise
and brilliantly
Rainbow-colored diamonds.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella9.xhtml b/readium/navigators/web/scripts/OEBPS/bella9.xhtml new file mode 100644 index 0000000000..2952a782be --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/bella9.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image
Story Picture
One gloomy day, when the long afternoon
shadows gave way to gray twilight,
a band of baddies, green with greed, emerged.
They were jealous of the friendship that
Bella and the children shared. They snuck up
on Bella, cut off the jewels with their
sharp knives, then ran away into the deep
dark night with bags full of Bella's jewels.
\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bm.png b/readium/navigators/web/scripts/OEBPS/bm.png new file mode 100644 index 0000000000000000000000000000000000000000..d679314e36d11b4a1400e4951138f41c9c8ab2ca GIT binary patch literal 20753 zcmcG#V|1m9wyhmil8T*FY`bFHwr$%sD>iG!wr$(4*tT!2wa?l(d!PHA_O*8Z%sJcp zbG~h$KfRA|IT=w{C`>3IARt(AF(CyYAmG;DzsVs%et$wp71RFy0yE{8<_7|*iGhC8 z{{jRgH!Lp1ujHoF&;jA5HI!EQ^?+QW7Td^^OaJn0a(r{cJv(j1)Aeu?XDX_yig^-q zq?TB+mV`m2{W^^L5@% z^fiRnd(hmdpNUo_T{WB}ISEUJW~F*@q~2g-t}OdwaZWNh1{R)9n_`jYJx7IIy3(q` z48y{LFm+$1ETvqHqOe>L6bE^3(Rg=^dTw`aPI3U5D!Br6ETvql?cp24@(R0+MvKG5 z?}wkyTkrcvb?wF##>sf$#E@rvR(S6*sd>Q1&cq67I}{AE%sl+XD((cdCKNy7pTVPc6U3@ zv&N*$7ArK_*%wW5nh^SjfAt3$51bUKRB7!PHAq!yH+k4i*BcF-9GCoDuv}CN?ML2v zzmPLMJTX-%*M7K9!U}R9ftuN1<~G;3IeTO&*Wlq|GE=`9pR+6iACi*w-Q~=pSvXy! zYbbYHon^VZ)AhD2uX7$rFzAawH94&vwqW1(h%mHv@BA(_nE;c?%u@SVWN+GF6w zc#ftlC1a?t>#$xwP*L@8w5YT5W`+0Myz=Sd@xy4Owty;`{T@DDwNj@wD!))PG-N16 zCT)pEv&Clr>TY^Dam7OCu|jz)MXl?4BS|t#WQ~(dg+}{zUSTZPct0ZPG)Jq>VgVUc z@Zc*0H#6Hd(`Ki^asR08XM?$uL4BQX$%46s)qJhbME~&oiL(hASeMe7zdOVuQuN?7nOz)^}@+y43PA6|NTj^V$7Vn%)s6^Y>Lns&OE6g+Jm&H1nzP{7sCMlV!YU7WDfNu-_tba(=K*nOdLE1jhDS# z#R}(r-Kqwb$MRR(PqSlOtfNymllKUctyfL5B8H+y;G%-X>+5a*nVFGQ%%Y?@oGi(% zTh_AjJX!erMy`9ZDXVH~YwBVg2HC*gI!jer_mh?D>rQk1+9*18MgyJB^;WBAjWLa} z^nJ-3ua`AR6&jKl^P&;++flO5v#F0g+mBxJ2J>8-(Rw4VKJc|4B6gKYbemlpl5L;ii4{)6@pr;-6FX?XCtJ9=EHP<*2<(99HTk8ayl(jIa-C6$S&P4W~=yg*A5>Th%{) zRH*St(@RPz=FK5bm8*B$99LDiKOBdLJUDMXO@^4NaNUx9nmd(x?yoK^jvQBc?@pz> z9d_A`z7+XFKKp*KKZSNhd3^*w<$R3pw&ZBN_Do%Nz9~+j>qKp|P#mBAgpqwb3GGRO z@8eV;gaWyo9|%nj-k|YDki&LpVfv-9@?KWpzZ5}ev&eH-(YdRQ?Ak%R-gflEQ+c^z z)f0X6Lf3O|U&C%`cP1KZKy^d0vKh@yXPm>A{c!X-UUMn3QirnrIL-Cm;b)F%NQP%b zo#jk)q!iabYQ3{&x2-PhW)0EH9IN-1`{fIC7qrJEtG(!>k?zfC z^U3W|r>=eXy{LZE?IoBHTTTTOd}TNk9dxJmH&jg=Y&Cbf{N5?D`-2K8yvwr;)$eq= zVjTPN-W%ML&sP26jy;^RgW2p^PR9l}1(JxOvcWj)A6LIBe+9OI@@^p4dfLX1g*!b) zZgcXsby?q@N84_^{t9fbd+l>Q7vt*WG?)^#pL`8`w2EP`r_x&^L)2_4#9_y%JtyjN zZ36eYa{0CBiY$W@!F!(R@S>KswLgl5F2O}Nh{q|1YL|E6uX|mAe4P@LuVXiIy{w6| zw~67}H12AvJ^cfzE2H7(p=DmCrlJgU2zCkNiaNS`KIchZdZ;HyyjGjy`pewogAfO6 ze-7RRH1NxzlOy>gjdDpqsbfT^x!u4O`(W5L>H`<%H8liuX<)*WrY)=|gg})fi7r!QJ>nx~1ret!`*u$JS>MQ~W8QW5l+%lzzB9p_iRjcCCYQ(m*{^$o8>wX=^Dx0`?_>^&mP z>8QcX-tbHrGAH3sC&@#Y9zK|%To`GfAb$EFA-y2cSdHSP9|$Zx2_WIIaN=>8U*kzf zEGRs^L|*)WP=G+F{Xm6)zG(S@I{`sP`F+g?f^PSNnFoS9^OOBb4z{05o)`imPZ}XS zLXN$k7nT?wpr8^V8BW2pUwD*=3&ICF3`Bwte&bAIT{|Ne()I|NAib zK0fYUV2~W5fPm!iS78E5r{H=ybPz$qVVD8}mb;KWIhw(}Gu5XNi*%;EIZ;yfF5_+ufje*Y+_RSz1gXkel+#pG2;PYeW zXnU7v=;6Ub$D-{($MxPS@-aLj55j?G%li_YZtHE^(f;zS^5Uf=uD&~aJZv*+`Z``t z@#5ScCFTNhs#B=yXaBD_sn2Vr&!6Sp+fi8B;!T{$7ceGIu14#4Q=P2I=!+S+vk5P` zoDVLNskVwirrN(&R{fCA;k7M6rxw?_*Rk!InT>okuZ}q`K^rb|lwYt*+T81(-X0RU zZB4N^u^TR*r(=A)PVaSJ-p+=ablzP*n|v>BN9opmuM#xrxKo;49Y=d)BV=%>U7Rc1 zTw3YgR2+*h<*cU7WS;bDeYg5N1I-^vYmq&6E*pZja)!klS(0OtxYH?RvAh!*Zphuq zdF`2aD|p$h=qctkk~VfuSKXX!eKiDZ0k&&_YdG6Y9z-_IA{!QW+)J1{ns|Ha+m0;+ zzZ^u58Xo-0vf!&82fn}*2LC7uiP{rkS#MU@*;er0YNFb#diYpa^<45mx_~_tY7&OH zHyXSfYJnluvGHjxqd72gecL=P&ofMW^#Jf3N33t*IvO!~#WYNtvfZxAjRyD3TPyBw zF0THn0dbYzqb&6nULcWoSdD)#A$LJ!-ag2@-CaouHQ2(FT;oi3>W}wcjdz|+ye%o| zH*M`#S9;Qrl*x#+(X_M)OZNo4r59WknnfZ`xC)&!OOC)gCP$Jt6Q+X*Cw&@4M3Q`l zHL%E`d`YjRg(Gc^Hhq!G*J2X2!GV6>kXv3Xv0{xoC#a2yoSzbI4IREibZ?SAMwc2n zoEX8KGsn%7rv?2f9TsWrbEp9-dyuoLW4AX@PQ)w2ekF3`$t%10F0kRB!>apX zKDLsReDNW_5r^(c+qLDkH!%3lYsUN9_A+PNl;dXqtGA5s99h0oH{S~FD_&R>&d!Xz zJR(=t?qmY`swUhGBCJ{R!`C7^fXmCu)(k4nEKSyTFi-~UKt?8D1n?dNB!5I)ek4j@ z@Ga)rM9%2Zb%}f> z4^sINKldN|LxaFvDnRjtP}L0RTP|3?A8ssIDIbOzsCzDgP=HJK+N$Gi~`hRVS4#_ z!XPOK$c=)VV=)8-ZNlJ=%|WCdM5Dxz^a*8!B9suRYlYjzFbIfDg`(@3{kuLS`+w{q z^4tu8RfE6)Yj$H-Lq>tLbu(4NP4I!p=#i>H4F+`RF{;6a1fJ{hs3C|1;pj`KA%h1? z>#L}t4F-Gb8>oE?38~PxQNtDq-O%??!vhb4H3(5791P<&h*v96AS|Wk@9(5SWeLyUc0wxINjWCFU$L4lMJ=Byt*rtu;X%{Yw1uC?vrEtZBT6K@tyUZ$>Fjn zoRfFFy_xFZ7I_=bW|YgRc<|97cxz!b1Gi(wKQMed;TUmI^s8dbjVPm`NSy*{-EQda z8^^`QNmO)svlGWl)t1ClRTXTrmJQs4Eqvz!;!Q5=+ksq|sOa!UqugU9gw8HS=f>Bj z(AmrTpsge6&aH39-!qSxGxrvdohokqJuP!RU5}!#MfvA~e|l2@bITWn?!srpyUOh0 zSVAw);Oz2T>G}2*=+=97a3=rSa@h@xzs)F{I-+JcDt> zf^1_zLMJ}?P8xBc7V$1*-C7)uzCe)RzKPsYBplsEayjZYITF5}fc%AQB2~Nd)a>P> zZ~{k z_>6!}r0|@`#3`Y17sMLjd@H0DQK8LH!c#^0UD8s!!wtgAN5EC?Fi$?Wd(Ypxf{3Ba zwvbE_a;wCf)+x&qy&ye89|O4{GLSw33;`m>HX`v)Bzk@1_GFN7vt#;(Ad9az$wuO7 z{o;5Cejt2ETXWqboIioTXknU7V)}JMrt(2mcS8>=s{&&$1Lq*gL5}jvlf!-iNTEc= z%d?G&B2tiiDJVxtL9z_4lrH*zzBTj*_ak6B2s(+u0}~4NhY=%^-pmV~yzm4FH-@2q zB{JHJDvo0T5j_aQ8L{kjb;m*OhN1_v0(R^sq=z~Knd|1DN3a6>-lIT|cJ?Kq$ATW) z3gWgWfS&LSQn5Fkp4>{}dl|NC6!dFve>EcvtY+VOHCq&1Ti;zZ4-5iUKTM5K6ryK8 zag78SL4UuQuBWD~s1CoPo!vXCsbh81a3s<-K_NyqFwrAdXuCFNWj5u?yZL&RkMrf$ zM-AyOP|JyLiUZf%nM6cswyvUFTZpY~G{1N`1bjD8A5>&VljGVQxfw29N!#bXJ!^DK z@y=^KyI0=&ia+i7665$#xJ=nb^t!m_0-22usFC{7M|L*EICD173}+)by23% zg?D-a-W!W=YL#@*lS0Q~4}}woid}IiIapG=6q$197dYUFZI2^Y=5g+?-7X$hhf{93 zb;KUsIC-xE?@l!hW#1n*Uu{jWpNc8oTy8tC43k>8uj3}<`Mqm;Ku1_T0(dZ`xVLgV z+jw`++!O`UmeTq!J7!--gBN|-5k6U`mOOMbsl_pAC~>N)zR^wMj7sB-ieX4aoQ+9k zk4sy?K3rVgo_QYW?rg`oJUCrD$5854l|qYBUSw7{y|SH-7MygSi);EO+1&;Iiut_X zY?Qs>is{Gp`0n)BMV!s4=Jvb`Q$>?jdAa}O6MOhBbJvqXB-?@2wcE7)>J#VoP_Vr5 z8Si}G@g&F_&HI+|>)bc%VPxwN+neXHzj7VfmPyOIWqZNs+#4d`AU|w`FSC63 z!(cV|-+}_Y5D*mvdUdV6kL>Bqc z-OOpKxUu}rD4M^#9{Rt^h*TJrz->Lw)EElfskn=wzy^V-1j%6x1~I9`D&g81PgCQ4T-+;58!MY> zX*xCg6$E(bahRkA0To|eMc=i^0PTY|IVX<1a`lIO%_+XgHJ2^drQee=lesuK1$`In z9+NCSWwAhc&c~L&CtjIMz2h}_c;(qWwq|De;u=E?UD|POdL-FRX`_k; z?up6nP2KK`tS}`#%;^u%1xI*uhM%=vr+F8f-`MVxw(h(??|yxDRGk%h&VAm$w>QBz zdbDIvQ3-W)nGM&^AIKhtz>|o=6$-m@v#p?@Oyi=>*zIaqs)@}6L)*8-fZKXeJzt&b z=XAw8yph>+epF2FKCYN%%d+3&k>Fk?>TakVU%z@S8y?j>#O4k7|H|mn%eX5UbY%PLaRNi~m?aZFSKK^hT@?LcPeD9eTG&CP7f&vv* z{05a%Ih9>Hl36;=s9G4q8^M~CU#*9DE(~CiW#E{-={3r%Bfmx= zVHIAqR}lvUeY^NU-bEenLt5MPyU>MTlQ;svg$_v1G3zLVjC2u#i-fKT>!E=iuOQr_0qdTEbnwCJsgPIS*nHWJ8(eQ?KSd>)<~WH}`exMQ|{rc<3>6`as0Jj{| zI#QOu0lrp!oBCLz=9r7CiPtQGbNk(asQ41==GIMJ(0j&cl`i&F#QBeoIjqN@6uwmj zPcFU!V%HxD;!~G4JV&%#czf?%nzcSH9eb~yt2!OiUN0WLCMQZS`*Fj99W|4Ih;%Sq zUe0W1U5}z&tm(&FXlFWJE}wy}*`8Miyh3=M4DT1RQ~^4rUwtcXCdXiZ+BSfH)*kmr zBBy>@ACtQWbTY2WmFs)RxvB6q&3Tvz-5Kn z8eXy`)=tM0(A)QOAAYlezpDU%U~7S6$Taxq9JsL=2tG^z0Wk;>R{*gR2&q+ouTz$g zSZKajG?;k8KQw^f7dt=5Tt7)r*rQS;KSX+e6g_|RSbxlJf1E1{;NVV3fgY4l^)L&W&v;%}~pg8|7Bkfuk00sRm#!t|p5-7UF0#4K&m!KR~`!$AqRh2;re@Op(E_r{^KJrk22_2d$Y z?+~`DFVo#c*yTWgY~zs6oh*?(p0v^Vak#fJ+ugwC>sFP$PrY zqwu}p%%o5p9XOP*X7*7O;yt{uaO_bu`brZiRF$;SIubkm+f(cl4t+<)p1er+4M`s;G6RXY1Po90W(C7rOibtw(Ra*g;f6NP1bIFlga1 zU3yixjj!WG(m^WD@g^s7qi^a}kLSSVkZ63L2oeCoaAmS>9?g?yKWRdK>x2I+0w=JG zee0&t^7XlSQuh*j#Y5dqwCRF_`|e6#b-pwEYN?GVD-aql)DEN&k!N zlb!S`y8TGHqXkP;6E3RJHmBG_zjd26`6eei*~ho`MHH}YJyUPrdh&byK((B*1Ux&> zG$`L$H92{ahdhL3Ya8q|V=R+#G=+ut8JwkJd}u{kqiVMaUD7f%t43X-dW#Bu`Y_lD z+}R>$wF%8tj+AQW32PQvY~s=^FXlMZf8P;1?dub^$>Da3!HTps&U~+rdmVOlh3(fm znp|H)Xs@Gj^X!>8RM5`Ga=R*|FnKjv@s|I_E1v>zH#U4x5}tRHpBAzoR}-F96W&p> zt~GNrvL35bDM<0uzV|(6rD*$2Yi>v6-eN>SQ{G=)#!djB-_?A`Euhl3ZvMtgP@dgY$Mp$jSYsWpp2yY~mM ziOuV$$fu{=8;2#E$)l54fEFQ5nqIEr`rZk>va%D262XNwOCNKtOF3&?tuX|H)t! zGK+xaA?Q#HxBZiQPZR_am>nM~-=8n`s{ubFB*Zg5VSZ38r%816QauM`kfH$wH7ap1^q@@nXb-~0~-4C^P;Kk%QT z=f6t*|6#Oee3v*5QUhp78^qVSP;A|%G08t?YFojjl1A8WnX!305f4vbyKbcW=q3(m z#)AqipPv|tBDuV`9=|x!H2G%xeniJk=~zd$jn~^&L^Z0^+{co5+|-}nrav8*(vRhZ zCMS-8ehj7C;*z&Il=A$t7)XLn;_u;JA+e78x-p;}2ust;wZ5sQC9kEP7^{Pju&_8g z$2!l;$g$2!_yX?nA{qiA4QTSL@2F;)BcqE^N-%h+S{uWX;i)TZ)3KVuw+#&-Wpa@Eh6bjA2`a-L`V6kBk9dvF-`8hr?92Cw z9LI1OJft958QkR*dt>XWJ)k2)>2*8C>LHuo1X3gr`ISwrz{DbS5vI7+$(j z7pQ_TFO6p2vQFoXPB@sAJo9K>WNU`L>*2DyE>_Yj9Tm^Xk47%(4JFgF-^kM8@6gUl zuRO~J9$lkdd9b8f3@gR5E4__M$FON6Gby1m#Ng|bMIzJHBn9J(4Q3}BT$Jy)Mz7Xt z-#3$EUhysv_GJKDdEe8SU*Fdae}i7mNPaZ+83QIkCLtMzyob@kct;4y3otY-_Jl)s z3iqL(+h=nbP#nOo-NB>^gm~6~7|2xw!Q-vo&jDmvPxS%;P^><}Q$Q%;@ zG5NvBff(??i-9QP|54a^Lw~t`=1hTBazA`>@rZ*W`i6436<@lHfL7Aix8n{|oDzv5r<_!W6MX{|m$WTVYRh zj_%a_o#EL`lGpGU2YMK0Hb|nS-o$Hl%1x=yVPBs9HW=s}H`mT;t=aa*g~pj3M;A(7 zd3HN#^{YN_HeY?Qyze$5t`xc1Su04IL>XFB*GBR&e~xsbr$vWxt+Q+rV16Q8=bD+kftsRJKCfJ-w1jR!FWWBUMf1Rge}0cl5{wZ*w{kyY$m=Fi(3l5!FrW= z=b>_TC%c`$ln7|d*ZJ_?-H18C^@?}di>{r7fUDCHQZb0?=% zkZS2j-9V8%DDY`t^_eJyp&DOK+y7%WI)+7$_;aCTqswbZ9 z^@gd;Ewb~vM8y0>LA8W*N3k}3)0Y^LI*3(DjaFg#K(~3qQIqWUUo;Ss8V%sqJsN+o z_j45~;y)^Pmi>P~@Bc|s>PW~)QHTgkDCxeoZtyAXHh7i}4~HDZrlL05x(?c!yfzETY8h4O zi6&N=m)gg)>wW7dNZ8olX1F zrbKkAD0oCvY8@fLM_?Ugx6Nraz|lu-K&(<(bxZQGT=5NQVZ@u zXsfZ&VMUW}+}Z$tLd&z9^&-XCX39AT8!L>)2^>MzBV- zQe+UN=`LD<7-NouYhi{A%0OZEGB~N#9X2TQM6yG3$EUXcJdEO?oV=apq)%Adueg&Y z;?nNXo$}g67hm zg!zIB`62=N;`FU|PwZge zEb4iTA|-vB)Bq$1M@?;QEf<(zKvu6T>a<<*NI!A^5zF3wo9t-bkSsiO?b7GzBIE3mJ39 zgzfyj^t}GM0KRQV$kX(95KGQf({?7Wusk;`v-=38%kQZUT_do{sb4F#w3A*QPw(Om zsW8;w>PK}oMhk6F3_T8dLJo979sSQ)WWj+p%S&G^x8u4u$Jg`=H|N6V$P3Du5$R9O zgB{tINETIyH%ZaalI(s*@0mjm0Byz%Xt}VfsAB+UAT5dRHPqVmYbn+zebS4E>GI}9 zYX3u+C&d~s#e>V`2ptl$dxfja!Q~s9`%=M8eK{@7Krn8?#01T^p$$yBOWdf(bDtx1 zmnE7ZcU|8nVR5fi1R8Q4?~L9D=;bk{#cJtO7ITPyhm|V$jY6)g~#i-y{UjHU4nmm z{rEqkV)^QGVsI?M>iX&!=nuhvB*j*--DauwiK#YZ)nlC$-YmvloXtJCW$YMvT5F}E zolvnKLp>nHaj=POCeWCxm(0I*JGX?;_FoUo zuxXyjxx{icu-(Op`I#BCoj6?69#qpizAj6b;xpb+vUA-IQ7C#CqPQDkXppe!PIc4! zC_Hoscuh=gr5S_^|LQt(tg&~^e|HfbuKLJzx3M*g$T_WPk##M!5h#?JM;uK8;&364 zMR+U3ldyVr(ZBx21PwqDwAHj!@sjW|6MA9(JoEEhS(+-+eVpiYYNvbI$euq3RbTVm zX@oPnU7~9X9*~Aamj?8qOVQ}yJiAH;P8H#<=y>nD`JVM1XFgq@?OjWB*4R%doHA%1 zGN$?#6YO1T5c;g+e)>p`cb@p^?(2RWHg zi}=q(aR`P%&6xst74%>P|j5FLo9e~x0dXvs1u)@6EpB1Hb;fu zs-O?CA3`iBfDaQAEDaxxIM6N@o=`vnQlhOP`fqut3iCgr4}EDjQ&=rZU{m4WbXb%6&$DH_8{xU;1 z4Q{Ot}fmNGbWxLV!YCCxKb;)xrowU`%X=jG9UY%@o zwd~Zg!*i4m_Ip%12Mmqz_xH}8@p9(2>?O)r+yptyGvm=Hl)e&!DBE-Ul;len;qXnr zaPZIaT}`aO4vyVEEKqI;148L<&x_++w?tJv%~KknGAiy`Uwt3Z3mCdk6={>Bnp+;KxD_oRmYm*(|Vv+O4g}b~KWhv`t$Qg@} zSJayPQgH%VRt?R1)3X%f<4~2;adeg4SO>N^R~%IzN?0T4yw_1)kCjGD7gslW`v=;p zs@E|ou8W%+*_YfEYnDcSXkKt{Hx1Sy2?@5CiJ{Th11=JoZ{NeuCi<@Fnnb;p5nt6k z6Nl7X7Ufj5F5>dsvqh;Ub0)ccC=VYt8o`;lhoAXq-|p4rjGvSHA)Z~wiE9lM@w8n| zA+IvSI=GQ4-VOL3w)2QShQ7GUjM=zkZEiRnRg+tyK2Pk(XFco*t5ZQdhk-Nw?#zE@ z0JANaW;R;vkK~!|(y_DBCfM!zQGY?b-`rkZl50nh4+shf7!4L1-+~;1mJgHz2u!3K zOu=vA7xObPvmfX`Ylz=Y{m9IOftL$u8cFOO8->QV7A=nAq{LnoS*#Hfb`mjn%CusW zTH5%WI{3d6JIy@TloXMB3iSUT*<%_3^Cb9VO=0>S>ir$h2~mv00{oT~LH+-i(J}-=98rgRb zoP-nEscOc@#vX@wsbSpYr97Y%qf#N!35(w^Ud2;f5{H6iQd^zZ3Xv=aLgbPF9-&pQ2|K&=UAl~o&+pU%i#x#y5wjNjz@?RFZr1J;O2 zI7RT>Q=z6}&^O9pugW^k<(=P;-Zwbo1Bf!HEFe}_O-reT$pcgB62bV(B7|xoSg3qwc6zEM_SJLr;R4xv&Am&=Grvg;3F5!;&2u2drS{r?E%Hw^AF}z z0GEHWi6^gp;{7pf7VW9E8pMN8mGf;Dz<-FS&Js{45b@6vt1FP&&q9FZ0wL%DW8;I6 z{{msk1?AHNlfwU^_UnsLF1Vc@gqH*#!TgH{t(bEM2^AZ+;&h91vWl5q!ji%&&oaz6 zrJqS;5;`Lk61|mVsXp1s^>LCc1KbTKnE~T+my;}~!?!)AIsMNt0iJc6` z-dUnO$N5YqMlc`bS>_GQZ~i{Ni&ebEUth%_9>i4(%`1FnF>7cui=>0%O7L{KG%}ts z(`cn2vShp67CYNW4$GZx(iw*Jl7xAV2 zDF-xwsPj{@N+^-NoUsjyDzJMfi{Ty>A-@aJw56Mdmf2Q!wGjU#eX*;&Eb0?4s&Jd0}$K!w(ikmgX-Ab0bBX9K7Z6ZsPWJnvjN|&PjJQ*{c zGllK5L4&$jLl(nZiIL0Oe6Of98iUDkjxq20;dxT7tLCmgTP_C)z9~~OM{2Moe3|n+ zKewp~u0;M~d8^@jd8fv43|Ip{M=efc*b56rIUS zQf@3XcwYp{kiV9!d&DP1>+qkn3ONY+Sl}o9PC8pi#40Hzv=Wx)?^|8`%`&J f7d zCj8G~p!9Ogz&|s?j%j7TtZ$VwmzriIH63&~%IAa2%Rek;?e;mU*1YsZ>r&Pe(5Rtz z({Ck=@jX%u&01OrtmV?G(Bj)MQrJeP3aM8`%6UfIY1VtIR-@C*NS{l!x^qp_LUiP7 z3#z^=BPb@&5e9CiDClQjREXjNkQCQ@0l)T>g zBvT)aOisk?#SMqwHCUITIv{SVY*9@x94$STQ>rSGw!FGX&wtQ=H@%UYYbGvW1aa4@ zgx)(*_)JVn-dog7?KXLzRmcgjDrd!1)>xCer^oE4P-R#(^ssXCDlc!UEAJ{Z&+Vw~ zAnu|*<+t`yyM7;QVX((B|9Y<~pAYKAHGjjixLED(*y&R>>?TGc~K|#=_pz?+> zSM4Gr&WCBmNSUwG!HHg&tgY3wT##?U(gMhoV{(QKsA)`N_TCa}g!_L#NO8A) ztC0~ghECrc>Jm%%ubl}9ObrMk3<#Ws|%NzVkd#4HfK z?d!2E)Wn+a6dvbPg41Opwz;LX9-%c2_~EF)kiXyVY{d#JKrwiF?H9UZ(hJeBdQ~P> z;HFK|#{xfl_DG;%+-YbCJTzIEhTFs9S`McT}+-!2dPMlU@sp0Q$!;Uytd9saRGOm zEtgW3Qmn^o#uBv^w+wu_&f2J=(mRZDQH{RHf-Kid?7@DS1DFNF6qHilEYstM72X|b z3Yi6HkIJBhlg?4qR}{QEwqZD7OJ~c~FONT7vx!q|?%`Vn1Gak=> z{e~a^i1$niQJiaDYr_3RQ&Gq~A=D#)9ouCzS=mm()ySP&kIsAqj;hOmfgY2!O<@!O zH7t;Vk)mG?<)00q=ux@yP}{SUpg_V~2(+R==MMbycqjTzOz)24pRad*kp400Bi`ds zchZmft(li2R96b(E3&YS#a@`KlK^0}+QAQ_3I$Soia1K@V{9Y^sP2139^NHv_k&Lb zRV8bqd|xI;UdjaAOUTE{x8M~HigRFLa5<`$?{M|iIse zh1L-(j(g+3uVif|__&v|)H4iJ?7XEhK2oJYJoe+bslQ@*G)hRrLTT2l$yBkmntsdih=R(;v*9~X%+A^#w&H}8gVq% z{_$DEuiqQ*lSJ=O(X0IX>7j5(6$Q^k?exvS%|z?~ zU{6I`oNz*-zALZeY4qH~Hs$&*^=E$2rY1UR!eyck`{*Ch7JR%JKNF_xlCVw)P^ZS( zS%|_QrpP`m4i7b>!$$n0Yb6rJ*4RqZZbe6Z3 zsgQq14}Zr=r6IE_|NZJjTI06_BbuJn7>X?vTKx!{@}^0L@ycRrN&d1bW(G3};80zHWHPiA*@}916P5^ML5t3`Stw-lwz#K& z{DCFeIhT&Qn7+faiA3>Y80vUQjN?{AaZ-%X)9a)wHF&qDYgvBq+M$rvXuPOE=|dm0@zD67SD9N{yz$ zh;`R!7W?9qI2K!F^j#lv>`qNz&aR|L(pKu1-g;lQ+~aoG>0d^p8H*yKbx3L*JF`7z zlsN$aQ>8y-6tkc7RmqP$7gEy~nNMc0o2m;)uX~7Z#$D1RY!QK2?Yc?fBtW}1EKqma zd~zK&Z%uW`ikIWO4D8DvRz811Af(8@YF9@cid#a&9j!2SO6fic-EApQ3YURz&*)4Z zHOpuk$CADP2N(z%NrpK+xxv|GUG34uM rQ}7u1xn413cIClI|9BDb^shDFLNq& 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 O0000 Bella The Dragon - Original Edition

More childrens eBooks from Catto Creations

(Touch the book title to find it in the iBookstore.)

Bella The Dragon (Read Aloud Edition)

Bella the Dragon - Read Aloud Edition is a classic picture book about the magic of friendship, the sadness of separation, and the joy of reunion.
(http://www.BellaTheDragon.com)

A Mom's Choice and Global eBook Award Winner.

This Read Aloud Edition features full page illustrations and a read to me audio option.

Bella and the Year of the Dragon - Read Aloud Edition

Bella and the Year of the Dragon - Read Aloud Edition
Grandfather tells Bella that she was born in the Year of the Dragon and shares a story about the animals in the Chinese Calendar to help Bella understand the importance of overcoming fears.
A Global eBook Award Finalist, this Read Aloud Edition features full page illustrations and an embedded App - a classic memory game featuring the animals of the Chinese calendar.
Awarded the QED Seal of Approval.

Look Around ... A Word Can Be Found!

Look Around ... A Word Can Be Found!
This cleverly illustrated story is sure to engage young readers learning words. The detailed, vivid, and unique perspective in the illustrations are hallmarks of the gifted artist, Amy Joe Gracyalny.
(http://www.artbyamyjoe.com)

This book is a fun reading adventure.

\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/books2.xhtml b/readium/navigators/web/scripts/OEBPS/books2.xhtml new file mode 100644 index 0000000000..bc09ad41fe --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/books2.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition

More children's eBooks from Catto Creations

(Touch the book title to find it in the iBookstore.)

A New Day

A New Day enables you to share the day's activities with your child. Interactive illustrations demonstrate colors, numbers, shapes, sports, dates, and time. Dynamic illustrations highlight the world around us - moon phases, calendars, and clocks are all correct at the time you read it.

Discover A New Day, everyday, with a child in your life.


Awarded the QED Seal of Approval.

Watch Me Grow

Watch Me Grow
Now you can watch your baby grow with increased confidence and skill. This concise book embeds video footage of key developmental milestones. The narration by a licensed pediatric Occupational Therapist provides practical and relevant context for interpreting your baby's developmental pace. This helpful reference is a must read and watch for parents.

I Love to Doodle

I Love to Doodle
One of life's most popular pastimes, doodling, is presented for those who like art, math, and/or computers. This short book shows the artistry in math and the math in artistry.

See how a teenager and her grandfather have different approaches for their doodles. This deceptively simple book provides a step by step guide to one teenager's favorite doodles, free-hand or using Scalable Vector Graphics.

\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/books3.xhtml b/readium/navigators/web/scripts/OEBPS/books3.xhtml new file mode 100644 index 0000000000..bb5f3ed16c --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/books3.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition

More childrens eBooks from Catto Creations

(Touch the book title to find it in the iBookstore.)

Bella The Dragon

Bella the Dragon - Fixed Format Edition is a classic picture book about the magic of friendship, the sadness of separation, and the joy of reunion.
(http://www.BellaTheDragon.com)

A Mom's Choice and Global eBook Award Winner.

This Fixed Format Edition features full page illustrations.

Bella and the Year of the Dragon - Fixed Format Edition

Bella and the Year of the Dragon - Fixed Format Edition
Grandfather tells Bella that she was born in the Year of the Dragon and shares a story about the animals in the Chinese Calendar to help Bella understand the importance of overcoming fears.

A Global eBook Award Finalist, this Fixed Format Edition features full page illustrations and an embedded App - a classic memory game featuring the animals of the Chinese calendar.


Learn SVG Interactively

Learn SVG Interactively

Interactively learn Scalable Vector Graphics (SVG), the graphics markup for the web. SVG, a World Wide Web Consortium (W3C) recommendation, is text that defines a graphic using a markup language.

Change the attributes of SVG elements and see the resulting change to the image inside the book. Learn how to get started creating your own SVG graphic.

\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/books4.xhtml b/readium/navigators/web/scripts/OEBPS/books4.xhtml new file mode 100644 index 0000000000..d867a6d409 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/books4.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition

Books in Print from Catto Creations


Bella and the Year of the Dragon

Bella and the Year of the Dragon
Grandfather tells Bella that she was born in the Year of the Dragon and shares a story about the animals in the Chinese Calendar to help Bella understand the importance of overcoming fears.

The 11" x 9" book features full page illustrations and is available from Amazon and Catto Creations.
A Mom's Choice Award Winner!

I Love to Doodle

I Love to Doodle is now available in print.

This book is a fun activity for youngsters wanting to draw each one and make their own book. As they grow older, they can reference this book to do their favorite doodles on the computer.

Available from Createspace and Amazon. Createspace is an Amazon company specializing in print on demand.

\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/content.opf b/readium/navigators/web/scripts/OEBPS/content.opf new file mode 100644 index 0000000000..778d1ef2b5 --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/content.opf @@ -0,0 +1 @@ + Bella The Dragon - Original Edition en 9780970263308 isbn Barbara Nick Nick, Barbara aut Elaine Steckler ill Jay Nick 2010-04-03 Bella the Dragon is a classic picture book about the magic of friendship, the sadness of separation, and the joy of reunion. Bella is a special dragon with scales made of sparkling jewels. Author, Barbara Nick, captures the mood and magic of childhood stories in this charming first story of Bella the Dragon. Illustrator, Elaine Steckler, brings life to words with her exquisite illustrations. This Read Aloud Edition features a read to me audio option. JUV051000 JUVENILE FICTION / Imagination & Play, JUV012030 JUVENILE FICTION / Fairy Tales & Folklore / General, JUV037000 JUVENILE FICTION / Fantasy & Magic Catto Creations Copyright Catto Creations 2000-2013. All rights reserved. 1.1 2013-02-05T13:00:00Z pre-paginated auto auto portrait \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/cover.jpg b/readium/navigators/web/scripts/OEBPS/cover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b240c18a2f0274d2f03fde047d58ef9e5783e81e GIT binary patch literal 163191 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 Y01X8HMTYr5Vt4;MA^87%4g7ud4|2-&1ONa4 literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/cover.xhtml b/readium/navigators/web/scripts/OEBPS/cover.xhtml new file mode 100644 index 0000000000..1dcee061ce --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/cover.xhtml @@ -0,0 +1,25 @@ + + + + + + + Bella The Dragon - Original Edition + + +

Bella The Dragon
+ + \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/info.xhtml b/readium/navigators/web/scripts/OEBPS/info.xhtml new file mode 100644 index 0000000000..3863ee63cc --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/info.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition
Upper Pointing Image
Bottom Pointing Image

To my children and grandchildren

ISBN: 9780970263308

written by Barbara Nick
illustrated by Elaine Steckler

Published by Catto Creations, LLC
http://www.cattocreations.com
http://www.BellaTheDragon.com

Other childrens books published by Catto Creations:
Bella The Dragon (Fixed Format Edition) by Barbara Nick
Bella The Dragon (Read Aloud Edition) by Barbara Nick
Bella and the Year of the Dragon by Barbara Nick
Bella and the Year of the Dragon - Read Aloud Edition by Barbara Nick
A New Day by Barbara Nick
I Love to Doodle by Taylor Beres
Look Around ... A Word Can Be Found! by Amy Joe Gracyalny


\ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/jewels.jpg b/readium/navigators/web/scripts/OEBPS/jewels.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2da6ecf45ec134adae464fccf08a71cb8c59e37e GIT binary patch literal 66151 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 literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/ll.png b/readium/navigators/web/scripts/OEBPS/ll.png new file mode 100644 index 0000000000000000000000000000000000000000..59d4e1521c49ae9f651d207506b09dced93e1fe9 GIT binary patch literal 56578 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%0DP!3^3iw9SOk8LW{Y+jXc|=w?FjZ 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 bgPQ(-&wL$2B&)%R00000NkvXXu0mjfZ4D0q literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/logotail.jpg b/readium/navigators/web/scripts/OEBPS/logotail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ff90b63e92143889a6cd7612f7feebd4025f633 GIT binary patch literal 23756 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
    A!mT&bb2uS*GSRd7#l3bv*JjU$rEZQjp3Vaa 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 z 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

    qPR$`H&$5squYhR3G}m>T||*4lKA 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 z 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%0ABxJ>I>{2v8-3R!+Kl=6R;pFF0M#rC8 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 Q9$4Ug<3$uyJ;^`+*;Wmt`2YX_ literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/page07.jpg b/readium/navigators/web/scripts/OEBPS/page07.jpg new file mode 100644 index 0000000000000000000000000000000000000000..08d5113fcede9f1ff2365a4458f4e3e417749bdc GIT binary patch literal 68602 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%0D$q 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

    3322NT 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 HUWfnL>%MW# literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/page09.jpg b/readium/navigators/web/scripts/OEBPS/page09.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52d85b32d52ced8197fa0ce547092e0ff5339084 GIT binary patch literal 55182 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�{ZM+)@_) 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

    Z58AE&w17 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�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�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 literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/page11.jpg b/readium/navigators/web/scripts/OEBPS/page11.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7e592f37e2920f4a32dac273539924ae1438a94a GIT binary patch literal 67998 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

    S-zZpc^35c8Nbm~{$@ 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 NFngcpMHEv5|Jh&t)HeVC literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/page13.jpg b/readium/navigators/web/scripts/OEBPS/page13.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b18e6259004771234dee84869484b1088d68f8c1 GIT binary patch literal 52612 zcmbT7Wl&tf*X9QuEVwiH5S-vJI3&2c1{)*{5@2w53+_$`t_i^*A@~5n-2)5~G{K!L z|97|Et=dn!+qdqg+jXmd)qPLj=Q*eUE&kg85UMCBD*#YXPym+C7vSFt;57gX6BCGu zfdvEtv9Ymm@JL_a;o{;^5t9&*(o)mY(Ncpz3}7Bs1|}|M5Qt5Lor{-GP*9Mb6(T9h zFTo=q$p4?0pkQNTbhMW%7DS369FT*StMlp5fg?~7gWti%&6Z~*p+`6PT;l)v0=$F_A>_2^eb ze-b*{6vr@oWdBKcf>L$Ydt}%UI6=(kD9|!hVMZ*5p8mAHXlg-4-n@2hD(|+_i}6%5699A zxFd=X^!HwrOg-`Coh>!c=J@8K_|PO*8srI+lyO%?YyYfXK)mBM0dlWG;tRy}%mzT9 za60Z{BU}1`q^#5G1e=R@8hMK1&Ots@=t%VZAbl&IS$hxIErjZK#d2|8UzThACam9! zuO(Qegr#<}b$pr~7;+%*aPn11QHF;*`@}%PG7^DWcUw8N!#~mozz}sFZ?;B-u2) zhv8H{JNk%&C{w3D{Jw8cDt)kUQ`Xq5%L2z0fOY^=EHK6*#=9CSJ)irFTSKitq*fr^rj?>a`R`O^f!s7+tgZ(f*W%Mr>t7RVWd5?9I;VG>c+ zB6cD>rDc<*6ATkj5N1nwjXXJh^3%^u{KeP`ZJETBY8qAiDp^bM0wL9OfvR0K4rN4< z)6~I~H-4+kLIak!qy5!Zdp7e$oJAf)J1SyV)Ukubm$Cm7ALc~yD)s?!YZ<@orIEf# z!;8M6ptKi3miJifiSy!@u;wpx`?K-{ot-o%*VLu^@!mx3HR>X}1Q7j8CQVu~-MQBy zLk&D)p>czbou7O|lOFIuvth~_s!CVO_5kY7=7T!*&N;3N(=Sos8*Z`$M?fm zRntCtQETxYK*3t^T;z!CbqMREE;3Q7+Q`1^C@4eur2<6j+r@zL?vaju;>l8(b-jfW zl$mj{=(=j%1e)n0dC2uvrEM6(Iuj=`Oxuyl?w+_Cs*e%Eqv`Tajzn4*o32^5pl2uM zZkmb)u$`|x!ef2=-3B)mQaSjsmM{K(4wGl%EDCz8Cgr|&?W`^j(*2h$QIVcIa7SCQGVzB9 zW}V~~@{dmA3mhFE^Ow*abq3n-5P7YRzh#s0x29m)Zc(A{w1>g|abI%teNnn~C#fOj zkv~bI^WJnOaZ8qd4E9w}+}EF9XK}*h=&N-3^qozE7iTXwYHXGnH-o^6uieJo#AnI<36{TU1-!pi#=3(8z3S^u=cfWFES|D zq*-uy$IiHbTFxeo83LM_t*OMgH4pJ96H}E#@QI=|el~GP6cqJ|+hYxXIEb`U)5UFq z=wATS#&EH{wJhQZA-lzkk)hg*wBM`sQ^5gW`CZi+qnKjDj`r^NQnafPgm7x#y8N9e zNR|3pC4x#)c0h0(OqB?PPg-g*$@~yk2@i-b2_K@H<%8h$+u(k_6>WPsLqOJ2tbBGTx?XY@&jU{qF_GKfobX!=Qjktf0%1G79*7Oi7uw zPEjIyC_d>(sRslWB}!^_78y1-$p!Ed7t z#$nsFvMwhT8Hpn(22uMMjj)qXK5>TYMJ|k`#d|<%IHpva>?`C51dqTN{YJJnxU zC8#57FV^~m$5M_B1Y_d*ossDImA7_9Z^mIj#3O+I2�PiR;5c&#OY;wDmOso&FLC3A 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 UqKc#t?1f&t^knS#N>Hh(* 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 z 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

    1Fp&iK^w|=gGr!ITOx5SJH6@3 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

    qDV9%VQ5yk#vBmX3e>iaflqK{{U%^Z~nDa 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 literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/page20.jpg b/readium/navigators/web/scripts/OEBPS/page20.jpg new file mode 100644 index 0000000000000000000000000000000000000000..19be7e4d3e357bc2c18b31f0fcae955e6226d770 GIT binary patch literal 36500 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%0DvWLkc?FX2pO3E?LLw6qC>**&_Yv5Nrig1L! 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

    T(XDqV2Hs`?zuDeKKT%0;k*t>% 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 N!xnj>iYs9=|JlAGGdchO literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/styles.css b/readium/navigators/web/scripts/OEBPS/styles.css new file mode 100644 index 0000000000..58cd9792de --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/styles.css @@ -0,0 +1,185 @@ +body {color:black;margin:0;width:750px;height:1000px;font-family:Times New Roman,Georgia,Arial;font-size:32px;} + +.dedication {position:absolute;top:180px;left:75px;width:600px;color:black;font-size:30px;font-family:Times New Roman, serif;text-align:center;} +.rights {position:absolute;top:450px;left:75px;width:600px;color:black;font-size:20px;font-family:Times New Roman, serif;text-align:left;} +.copyright {position:absolute;top:945px;left:75px;width:600px;color:black;font-size:18px;text-align:center;} + +.books {margin:10px 0px;color:#6F6067;font-size:20px;background-color:#fffff0;} +.books img {clear:both;float:left;margin:0 25px 40px 25px;border:thin #6F6067 solid;} +.books p {margin:0 45px 0 0;text-align:justify;} + +.red {color:red;} +.orange {color:orange;} +.yellow {color:gold;} +.green {color:lime;} +.blue {color:blue;} +.indigo {color:indigo;} +.violet {color:purple;} +.fuchsia {color:fuchsia;} + +#ul {position:absolute;top:60px;left:75px;width:267px;} +#ll {position:absolute;top:657px;left:75px;width:267px;} +#ur {position:absolute;top:60px;left:408px;width:267px;} +#lr {position:absolute;top:657px;left:408px;width:267px;} + +#ml {position:absolute;top:495px;left:75px;-webkit-transform:translate(-198px,-19px) rotate(90deg) scale(0.72);transform:translate(-198px,-19px) rotate(90deg) scale(0.72);} +#mr {position:absolute;top:495px;left:75px;-webkit-transform:translate(356px,-19px) rotate(270deg) scale(0.72);transform:translate(356px,-19px) rotate(270deg) scale(0.72);} +#pic0 {position:absolute;top:180px;left:116px;width:518px;border:0px #cccccc solid;} + +#um {position:absolute;top:900px;left:154px;} +#bm {position:absolute;top:60px;left:154px;} +#pic {position:absolute;top:110px;left:74px;width:600px;border:2px #cccccc solid;border-radius:0px;} + +#pic151 {position:absolute;top:110px;left:85px;width:287px;} +#pic152 {position:absolute;top:380px;left:85px;width:287px;} +#pic153 {position:absolute;top:630px;left:97px;width:263px;} +#pic16 {position:absolute;top:110px;left:75px;width:600px;} +#pic21 {position:absolute;top:110px;left:75px;width:600px;} + +#b0-1 {position:absolute;top:110px;left:75px;width:600px;text-align:center;font-size:54px;} +#b0-2 {position:absolute;top:600px;left:75px;width:600px;text-align:center;} +#b0-3 {position:absolute;top:730px;left:75px;width:600px;text-align:center;} +#b0-4 {position:absolute;top:870px;left:75px;width:600px;text-align:center;font-size:20px;} + +#b1-1 {position:absolute;top:630px;left:75px;width:560px;padding-left:40px;text-align:left;} +#b1-2 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} +#b1-3 {position:absolute;top:790px;left:75px;width:560px;padding-right:40px;text-align:right;} + +#b2-1 {position:absolute;top:630px;left:75px;width:600px;text-align:center;} +#b2-2 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} +#b2-3 {position:absolute;top:790px;left:75px;width:600px;text-align:center;} + +#b3-1 {position:absolute;top:590px;left:75px;width:600px;text-align:center;} +#b3-2 {position:absolute;top:650px;left:75px;width:600px;text-align:center;} +#b3-3 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} +#b3-4 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} +#b3-5 {position:absolute;top:830px;left:75px;width:600px;text-align:center;} + +#b4-1 {position:absolute;top:590px;left:75px;width:600px;text-align:center;} +#b4-2 {position:absolute;top:720px;left:275px;} +#b4-3 {position:absolute;top:685px;left:75px;width:600px;text-align:center;} +#b4-4 {position:absolute;top:650px;left:440px;} +#b4-5 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} +#b4-6 {position:absolute;top:830px;left:75px;width:600px;text-align:center;} + +#b5-1 {position:absolute;top:620px;left:75px;width:600px;text-align:center;} +#b5-2 {position:absolute;top:680px;left:75px;width:600px;text-align:center;} +#b5-3 {position:absolute;top:740px;left:75px;width:600px;text-align:center;} +#b5-4 {position:absolute;top:800px;left:75px;width:600px;text-align:center;} + +#b6-1 {position:absolute;top:620px;left:75px;width:600px;text-align:center;} +#b6-2 {position:absolute;top:680px;left:75px;width:600px;text-align:center;} +#b6-3 {position:absolute;top:740px;left:75px;width:600px;text-align:center;} +#b6-4 {position:absolute;top:800px;left:75px;width:600px;text-align:center;} + +#b7-1 {position:absolute;top:570px;left:75px;width:600px;text-align:center;} +#b7-2 {position:absolute;top:630px;left:75px;width:600px;text-align:center;color:purple;} +#b7-3 {position:absolute;top:690px;left:75px;width:600px;text-align:center;color:skyblue;} +#b7-4 {position:absolute;top:750px;left:75px;width:600px;text-align:center;color:seagreen;} +#b7-5 {position:absolute;top:810px;left:75px;width:600px;text-align:center;color:silver;} +#b7-6 {position:absolute;top:870px;left:75px;width:600px;text-align:center;color:red;} + +#b8-1 {position:absolute;top:570px;left:75px;width:600px;text-align:center;color:lime;} +#b8-2 {position:absolute;top:630px;left:75px;width:600px;text-align:center;color:blue;} +#b8-3 {position:absolute;top:690px;left:75px;width:600px;text-align:center;color:gold;} +#b8-4 {position:absolute;top:750px;left:75px;width:600px;text-align:center;color:turquoise;} +#b8-5 {position:absolute;top:810px;left:75px;width:600px;text-align:center;} +#b8-6 {position:absolute;top:870px;left:75px;width:600px;text-align:center;} + +#b9-1 {position:absolute;top:570px;left:75px;width:600px;text-align:center;} +#b9-2 {position:absolute;top:610px;left:75px;width:600px;text-align:center;} +#b9-3 {position:absolute;top:650px;left:75px;width:600px;text-align:center;} +#b9-4 {position:absolute;top:690px;left:75px;width:600px;text-align:center;} +#b9-5 {position:absolute;top:730px;left:75px;width:600px;text-align:center;} +#b9-6 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} +#b9-7 {position:absolute;top:810px;left:75px;width:600px;text-align:center;} +#b9-8 {position:absolute;top:850px;left:75px;width:600px;text-align:center;} + +#b10-1 {position:absolute;top:590px;left:75px;width:600px;text-align:center;} +#b10-2 {position:absolute;top:650px;left:75px;width:600px;text-align:center;} +#b10-3 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} +#b10-4 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} +#b10-5 {position:absolute;top:830px;left:75px;width:600px;text-align:center;} + +#b11-1 {position:absolute;top:630px;left:210px;} +#b11-2 {position:absolute;top:680px;left:75px;width:600px;text-align:center;} +#b11-3 {position:absolute;top:730px;left:460px;} +#b11-4 {position:absolute;top:800px;left:75px;width:600px;text-align:center;} + +#b12-1 {position:absolute;top:590px;left:75px;width:600px;text-align:center;} +#b12-2 {position:absolute;top:650px;left:75px;width:600px;text-align:center;} +#b12-3 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} +#b12-4 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} +#b12-5 {position:absolute;top:830px;left:75px;width:600px;text-align:center;} + +#b13-1 {position:absolute;top:650px;left:75px;width:600px;text-align:center;} +#b13-2 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} +#b13-3 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} + +#b14-1 {position:absolute;top:590px;left:75px;width:600px;text-align:center;} +#b14-2 {position:absolute;top:650px;left:75px;width:600px;text-align:center;} +#b14-3 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} +#b14-4 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} +#b14-5 {position:absolute;top:830px;left:75px;width:600px;text-align:center;} + +#b15-1 {position:absolute;top:150px;left:375px;width:300px;text-align:center;} +#b15-2 {position:absolute;top:200px;left:375px;width:300px;text-align:center;} +#b15-3 {position:absolute;top:250px;left:375px;width:300px;text-align:center;} +#b15-4 {position:absolute;top:430px;left:375px;width:300px;text-align:center;} +#b15-5 {position:absolute;top:480px;left:375px;width:300px;text-align:center;} +#b15-6 {position:absolute;top:655px;left:375px;width:300px;text-align:center;} +#b15-7 {position:absolute;top:705px;left:375px;width:300px;text-align:center;} +#b15-8 {position:absolute;top:755px;left:375px;width:300px;text-align:center;} +#b15-9 {position:absolute;top:805px;left:375px;width:300px;text-align:center;} + +#b16-1 {position:absolute;top:600px;left:75px;width:600px;text-align:center;} +#b16-2 {position:absolute;top:730px;left:275px;} +#b16-3 {position:absolute;top:695px;left:75px;width:600px;text-align:center;} +#b16-4 {position:absolute;top:660px;left:440px;} +#b16-5 {position:absolute;top:800px;left:75px;width:600px;text-align:center;} + +#b17-1 {position:absolute;top:580px;left:75px;width:600px;text-align:center;} +#b17-2 {position:absolute;top:625px;left:75px;width:600px;text-align:center;} +#b17-3 {position:absolute;top:670px;left:75px;width:600px;text-align:center;} +#b17-4 {position:absolute;top:715px;left:75px;width:600px;text-align:center;} +#b17-5 {position:absolute;top:760px;left:75px;width:600px;text-align:center;} +#b17-6 {position:absolute;top:805px;left:75px;width:600px;text-align:center;} +#b17-7 {position:absolute;top:850px;left:75px;width:600px;text-align:center;} + +#b18-1 {position:absolute;top:590px;left:75px;width:600px;text-align:center;} +#b18-2 {position:absolute;top:650px;left:75px;width:600px;text-align:center;} +#b18-3 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} +#b18-4 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} +#b18-5 {position:absolute;top:830px;left:75px;width:600px;text-align:center;} + +#b19-1 {position:absolute;top:590px;left:75px;width:600px;text-align:center;} +#b19-2 {position:absolute;top:650px;left:75px;width:600px;text-align:center;} +#b19-3 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} +#b19-4 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} +#b19-5 {position:absolute;top:830px;left:75px;width:600px;text-align:center;} + +#b20-1 {position:absolute;top:620px;left:75px;width:600px;text-align:center;} +#b20-2 {position:absolute;top:680px;left:75px;width:600px;text-align:center;} +#b20-3 {position:absolute;top:740px;left:75px;width:600px;text-align:center;} +#b20-4 {position:absolute;top:800px;left:75px;width:600px;text-align:center;} + +#b21-1 {position:absolute;top:350px;left:75px;width:600px;text-align:center;} +#b21-2 {position:absolute;top:400px;left:75px;width:600px;text-align:center;color:purple;} +#b21-3 {position:absolute;top:445px;left:75px;width:600px;text-align:center;color:skyblue;} +#b21-4 {position:absolute;top:490px;left:75px;width:600px;text-align:center;color:seagreen;} +#b21-5 {position:absolute;top:535px;left:75px;width:600px;text-align:center;color:silver;} +#b21-6 {position:absolute;top:580px;left:75px;width:600px;text-align:center;color:red;} +#b21-7 {position:absolute;top:625px;left:75px;width:600px;text-align:center;color:lime;} +#b21-8 {position:absolute;top:670px;left:75px;width:600px;text-align:center;color:blue;} +#b21-9 {position:absolute;top:715px;left:75px;width:600px;text-align:center;color:gold;} +#b21-10 {position:absolute;top:760px;left:75px;width:600px;text-align:center;color:turquoise;} +#b21-11 {position:absolute;top:805px;left:75px;width:600px;text-align:center;} +#b21-12 {position:absolute;top:850px;left:75px;width:600px;text-align:center;} + +#b22-1 {position:absolute;top:620px;left:75px;width:600px;text-align:center;} +#b22-2 {position:absolute;top:680px;left:75px;width:600px;text-align:center;} +#b22-3 {position:absolute;top:740px;left:75px;width:600px;text-align:center;} +#b22-4 {position:absolute;top:800px;left:75px;width:600px;text-align:center;} + +a:visited, a:link {text-decoration:none;color:blue;} +a:hover {text-decoration:none;color:red} diff --git a/readium/navigators/web/scripts/OEBPS/toc.xhtml b/readium/navigators/web/scripts/OEBPS/toc.xhtml new file mode 100644 index 0000000000..8f0cafa1bf --- /dev/null +++ b/readium/navigators/web/scripts/OEBPS/toc.xhtml @@ -0,0 +1 @@ + Bella The Dragon - Original Edition

    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/ul.png b/readium/navigators/web/scripts/OEBPS/ul.png new file mode 100644 index 0000000000000000000000000000000000000000..d2aa069267e98a63dee44f91c157349d2bf4dc9f GIT binary patch literal 56405 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�Y!F@W4-41?z;2u52DT)5-+NQztaSs+_(Gb+KUe- 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

    6^kCayH^r9Ia^WV)4Y8DO))7U*0=CE6 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 literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/ur.png b/readium/navigators/web/scripts/OEBPS/ur.png new file mode 100644 index 0000000000000000000000000000000000000000..061b47c5ba0c45d3184eb22a0b1432d216a4af94 GIT binary patch literal 56327 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 literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/README.md b/readium/navigators/web/scripts/README.md new file mode 100644 index 0000000000..8b722f603f --- /dev/null +++ b/readium/navigators/web/scripts/README.md @@ -0,0 +1,5 @@ +# Readium JS (Kotlin) + +A set of JavaScript files used by the Kotlin EPUB navigator. + +This folder starts with an underscore to prevent Gradle from embedding it as an asset. diff --git a/readium/navigators/web/scripts/babel.config.json b/readium/navigators/web/scripts/babel.config.json new file mode 100644 index 0000000000..40e295724c --- /dev/null +++ b/readium/navigators/web/scripts/babel.config.json @@ -0,0 +1,3 @@ +{ + "presets": ["@babel/preset-env"] +} diff --git a/readium/navigators/web/scripts/dist/prepaginated-double-index.html b/readium/navigators/web/scripts/dist/prepaginated-double-index.html new file mode 100644 index 0000000000..b6c044dbd9 --- /dev/null +++ b/readium/navigators/web/scripts/dist/prepaginated-double-index.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + +
    + + + +
    + + + + diff --git a/readium/navigators/web/scripts/dist/prepaginated-double-script.js b/readium/navigators/web/scripts/dist/prepaginated-double-script.js new file mode 100644 index 0000000000..7f31f62f99 --- /dev/null +++ b/readium/navigators/web/scripts/dist/prepaginated-double-script.js @@ -0,0 +1,2 @@ +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){var t,e,s,h,n,a,o,r;if(!this.viewport||!this.leftPage.size&&!this.rightPage.size)return;const l={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(l);const g={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(g);const d=(null!==(e=null===(t=this.leftPage.size)||void 0===t?void 0:t.width)&&void 0!==e?e:0)+(null!==(h=null===(s=this.rightPage.size)||void 0===s?void 0:s.width)&&void 0!==h?h:0),m=Math.max(null!==(a=null===(n=this.leftPage.size)||void 0===n?void 0:n.height)&&void 0!==a?a:0,null!==(r=null===(o=this.rightPage.size)||void 0===o?void 0:o.height)&&void 0!==r?r:0),c={width:d,height:m},u=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,c,this.viewport);this.metaViewport.content=(new i).setInitialScale(u).setMinimumScale(u).setWidth(d).setHeight(m).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),n=new e(i,s,h);t.loadSpread=function(t){n.loadSpread(t)},t.setViewport=function(t,i,e,s,h,a){const o={width:t,height:i},r={top:e,left:s,bottom:h,right:a};n.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);n.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +//# sourceMappingURL=prepaginated-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map new file mode 100644 index 0000000000..dabdcd44ce --- /dev/null +++ b/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map @@ -0,0 +1 @@ +{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (viewport instanceof HTMLMetaElement) {\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n if (!this.viewport || (!this.leftPage.size && !this.rightPage.size)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n const contentWidth = ((_b = (_a = this.leftPage.size) === null || _a === void 0 ? void 0 : _a.width) !== null && _b !== void 0 ? _b : 0) + ((_d = (_c = this.rightPage.size) === null || _c === void 0 ? void 0 : _c.width) !== null && _d !== void 0 ? _d : 0);\n const contentHeight = Math.max((_f = (_e = this.leftPage.size) === null || _e === void 0 ? void 0 : _e.height) !== null && _f !== void 0 ? _f : 0, (_h = (_g = this.rightPage.size) === null || _g === void 0 ? void 0 : _g.height) !== null && _h !== void 0 ? _h : 0);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","width","height","size","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","_a","_b","_c","_d","_e","_f","_g","_h","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-single-index.html b/readium/navigators/web/scripts/dist/prepaginated-single-index.html new file mode 100644 index 0000000000..d72e5eb9a2 --- /dev/null +++ b/readium/navigators/web/scripts/dist/prepaginated-single-index.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + + +
    + +
    + + + diff --git a/readium/navigators/web/scripts/dist/prepaginated-single-script.js b/readium/navigators/web/scripts/dist/prepaginated-single-script.js new file mode 100644 index 0000000000..a5d1c82d86 --- /dev/null +++ b/readium/navigators/web/scripts/dist/prepaginated-single-script.js @@ -0,0 +1,2 @@ +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +//# sourceMappingURL=prepaginated-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map new file mode 100644 index 0000000000..a8d60fb818 --- /dev/null +++ b/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map @@ -0,0 +1 @@ +{"version":3,"file":"prepaginated-single-script.js","mappings":"yBACO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAEhB,GADAC,KAAKC,QAAU,CAAEC,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,IAC/CP,EAAOQ,cACR,MAAMC,MAAM,mDAEhBP,KAAKD,SAAWA,EAChBC,KAAKF,OAASA,EACdE,KAAKF,OAAOU,iBAAiB,QAAQ,KAAQR,KAAKS,gBAAgB,GACtE,CACA,IAAAC,GACIV,KAAKF,OAAOa,MAAMC,QAAU,OAChC,CACA,IAAAC,GACIb,KAAKF,OAAOa,MAAMC,QAAU,MAChC,CAEA,UAAAE,CAAWb,GACHD,KAAKC,SAAWA,IAGpBD,KAAKF,OAAOa,MAAMI,UAAYf,KAAKC,QAAQC,IAAM,KACjDF,KAAKF,OAAOa,MAAMK,WAAahB,KAAKC,QAAQI,KAAO,KACnDL,KAAKF,OAAOa,MAAMM,aAAejB,KAAKC,QAAQG,OAAS,KACvDJ,KAAKF,OAAOa,MAAMO,YAAclB,KAAKC,QAAQE,MAAQ,KACzD,CAEA,QAAAgB,CAASC,GACLpB,KAAKF,OAAOuB,IAAMD,CACtB,CACA,cAAAX,GACI,MAAMa,EAAWtB,KAAKF,OAAOQ,cAAciB,SAASC,cAAc,uBAClE,GAAIF,aAAoBG,gBACpB,OAEJ,MAAMC,EAAW1B,KAAK2B,cAAcL,GAC/BI,IAIL1B,KAAKF,OAAOa,MAAMiB,MAAQF,EAASE,MAAQ,KAC3C5B,KAAKF,OAAOa,MAAMkB,OAASH,EAASG,OAAS,KAC7C7B,KAAK8B,KAAOJ,EACZ1B,KAAKD,SAASU,iBAClB,CAEA,aAAAkB,CAAcI,GACV,MAAMC,EAAQ,uBACRC,EAAa,IAAIC,IACvB,IAAIC,EACJ,KAAQA,EAAQH,EAAMI,KAAKL,EAAaM,UACvB,MAATF,GACAF,EAAWK,IAAIH,EAAM,GAAIA,EAAM,IAGvC,MAAMP,EAAQW,WAAWN,EAAWO,IAAI,UAClCX,EAASU,WAAWN,EAAWO,IAAI,WACzC,OAAIZ,GAASC,EACF,CAAED,QAAOC,eAGhB,CAER,EChEG,MAAMY,EACT,eAAAC,CAAgBC,GAEZ,OADA3C,KAAK4C,aAAeD,EACb3C,IACX,CACA,eAAA6C,CAAgBF,GAEZ,OADA3C,KAAK8C,aAAeH,EACb3C,IACX,CACA,QAAA+C,CAASnB,GAEL,OADA5B,KAAK4B,MAAQA,EACN5B,IACX,CACA,SAAAgD,CAAUnB,GAEN,OADA7B,KAAK6B,OAASA,EACP7B,IACX,CACA,KAAAiD,GACI,MAAMC,EAAa,GAanB,OAZIlD,KAAK4C,cACLM,EAAWC,KAAK,iBAAmBnD,KAAK4C,cAExC5C,KAAK8C,cACLI,EAAWC,KAAK,iBAAmBnD,KAAK8C,cAExC9C,KAAK4B,OACLsB,EAAWC,KAAK,SAAWnD,KAAK4B,OAEhC5B,KAAK6B,QACLqB,EAAWC,KAAK,UAAYnD,KAAK6B,QAE9BqB,EAAWE,KAAK,KAC3B,EC7BG,MAAMC,EACT,WAAAxD,CAAYC,EAAQwD,GAChBtD,KAAKuD,IAAM,UACXvD,KAAKwD,OAAS,CAAEtD,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GACnDL,KAAKsD,aAAeA,EACpB,MAAMvD,EAAW,CAAEU,eAAgB,KAAQT,KAAKS,gBAAgB,GAChET,KAAKyD,KAAO,IAAI7D,EAAYE,EAAQC,EACxC,CACA,WAAA2D,CAAYpC,EAAUkC,GACdxD,KAAKsB,UAAYA,GAAYtB,KAAKwD,QAAUA,IAGhDxD,KAAKsB,SAAWA,EAChBtB,KAAKwD,OAASA,EACdxD,KAAK2D,SACT,CACA,MAAAC,CAAOL,GACCvD,KAAKuD,KAAOA,IAGhBvD,KAAKuD,IAAMA,EACXvD,KAAK2D,SACT,CACA,YAAAE,CAAazC,GACTpB,KAAKyD,KAAK5C,OACVb,KAAKyD,KAAKtC,SAASC,EACvB,CACA,cAAAX,GACST,KAAKyD,KAAK3B,MAIX9B,KAAK2D,QAEb,CACA,MAAAA,GACI,IAAK3D,KAAKyD,KAAK3B,OAAS9B,KAAKsB,SACzB,OAEJ,MAAMrB,EAAU,CAAEC,IAAKF,KAAKwD,OAAOtD,IAAKC,MAAOH,KAAKwD,OAAOrD,MAAOC,OAAQJ,KAAKwD,OAAOpD,OAAQC,KAAML,KAAKwD,OAAOnD,MAChHL,KAAKyD,KAAK3C,WAAWb,GACrB,MAAM0C,EC5CP,SAAsBY,EAAKlB,EAASyB,GACvC,OAAQP,GACJ,IAAK,UACD,OAOZ,SAAoBlB,EAASyB,GACzB,MAAMC,EAAaD,EAAUlC,MAAQS,EAAQT,MACvCoC,EAAcF,EAAUjC,OAASQ,EAAQR,OAC/C,OAAOoC,KAAKC,IAAIH,EAAYC,EAChC,CAXmBG,CAAW9B,EAASyB,GAC/B,IAAK,QACD,OAUZ,SAAkBzB,EAASyB,GACvB,OAAOA,EAAUlC,MAAQS,EAAQT,KACrC,CAZmBwC,CAAS/B,EAASyB,GAC7B,IAAK,SACD,OAWZ,SAAmBzB,EAASyB,GACxB,OAAOA,EAAUjC,OAASQ,EAAQR,MACtC,CAbmBwC,CAAUhC,EAASyB,GAEtC,CDmCsBQ,CAAatE,KAAKuD,IAAKvD,KAAKyD,KAAK3B,KAAM9B,KAAKsB,UAC1DtB,KAAKsD,aAAajB,SAAU,IAAII,GAC3BC,gBAAgBC,GAChBE,gBAAgBF,GAChBI,SAAS/C,KAAKyD,KAAK3B,KAAKF,OACxBoB,UAAUhD,KAAKyD,KAAK3B,KAAKD,QACzBoB,QACLjD,KAAKyD,KAAK/C,MACd,EEpCJ,IAAI6D,GACJ,SAAWA,GACP,MAAMzE,EAASyB,SAASiD,eAAe,QACjClB,EAAe/B,SAASC,cAAc,uBACtCiD,EAAU,IAAIpB,EAAkBvD,EAAQwD,GAI9CiB,EAAOV,aAHP,SAAsBzC,GAClBqD,EAAQZ,aAAazC,EACzB,EAOAmD,EAAOb,YALP,SAAqBgB,EAAgBC,EAAgBC,EAAUC,EAAWC,EAAaC,GACnF,MAAMzD,EAAW,CAAEM,MAAO8C,EAAgB7C,OAAQ8C,GAC5CnB,EAAS,CAAEtD,IAAK0E,EAAUvE,KAAMwE,EAAWzE,OAAQ0E,EAAa3E,MAAO4E,GAC7EN,EAAQf,YAAYpC,EAAUkC,EAClC,EAQAe,EAAOX,OANP,SAAgBL,GACZ,GAAW,WAAPA,GAA2B,SAAPA,GAAyB,UAAPA,EACtC,MAAMhD,MAAM,sBAAsBgD,KAEtCkB,EAAQb,OAAOL,EACnB,CAEH,CArBD,CAqBGgB,IAAWA,EAAS,CAAC,IACxBS,OAAOC,UAAUtB,OAASY,C","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (viewport instanceof HTMLMetaElement) {\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","width","height","size","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/package.json b/readium/navigators/web/scripts/package.json new file mode 100644 index 0000000000..ca9eb712d8 --- /dev/null +++ b/readium/navigators/web/scripts/package.json @@ -0,0 +1,40 @@ +{ + "name": "readium-js", + "author": "Readium Foundation", + "version": "0.1.0", + "license": "BSD-3-Clause", + "description": "A set of scripts for the EPUB navigator", + "private": true, + "scripts": { + "dev": "vite dev", + "bundle": "webpack", + "lint": "eslint 'src/**'", + "checkformat": "prettier --check '**/*.js'", + "format": "prettier --list-different --write '**/*.js'" + }, + "browserslist": [ + "Android >= 4" + ], + "devDependencies": { + "copy-webpack-plugin": "^12.0.2", + "@babel/core": "^7.23.0", + "@babel/preset-env": "^7.22.20", + "babel-loader": "^8.3.0", + "eslint": "^8.57.0", + "@typescript-eslint/eslint-plugin": "^8.3.0", + "@typescript-eslint/parser": "^8.3.0", + "prettier": "2.3.1", + "vite": "^5.4.1", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" + }, + "dependencies": { + "approx-string-match": "^1.1.0", + "css-selector-generator": "^3.6.6", + "hash.js": "^1.1.7", + "source-map-loader": "^5.0.0", + "string.prototype.matchall": "^4.0.10", + "ts-loader": "^9.5.1" + }, + "packageManager": "pnpm@8.8.0+sha256.d713a5750e41c3660d1e090608c7f607ad00d1dd5ba9b6552b5f390bf37924e9" +} diff --git a/readium/navigators/web/scripts/pnpm-lock.yaml b/readium/navigators/web/scripts/pnpm-lock.yaml new file mode 100644 index 0000000000..3ba6fb5827 --- /dev/null +++ b/readium/navigators/web/scripts/pnpm-lock.yaml @@ -0,0 +1,4067 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + approx-string-match: + specifier: ^1.1.0 + version: 1.1.0 + css-selector-generator: + specifier: ^3.6.6 + version: 3.6.6 + hash.js: + specifier: ^1.1.7 + version: 1.1.7 + source-map-loader: + specifier: ^5.0.0 + version: 5.0.0(webpack@5.88.2) + string.prototype.matchall: + specifier: ^4.0.10 + version: 4.0.10 + ts-loader: + specifier: ^9.5.1 + version: 9.5.1(typescript@5.5.4)(webpack@5.88.2) + +devDependencies: + '@babel/core': + specifier: ^7.23.0 + version: 7.23.0 + '@babel/preset-env': + specifier: ^7.22.20 + version: 7.22.20(@babel/core@7.23.0) + '@typescript-eslint/eslint-plugin': + specifier: ^8.3.0 + version: 8.3.0(@typescript-eslint/parser@8.3.0)(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': + specifier: ^8.3.0 + version: 8.3.0(eslint@8.57.0)(typescript@5.5.4) + babel-loader: + specifier: ^8.3.0 + version: 8.3.0(@babel/core@7.23.0)(webpack@5.88.2) + copy-webpack-plugin: + specifier: ^12.0.2 + version: 12.0.2(webpack@5.88.2) + eslint: + specifier: ^8.57.0 + version: 8.57.0 + prettier: + specifier: 2.3.1 + version: 2.3.1 + vite: + specifier: ^5.4.1 + version: 5.4.1 + webpack: + specifier: ^5.88.2 + version: 5.88.2(webpack-cli@5.1.4) + webpack-cli: + specifier: ^5.1.4 + version: 5.1.4(webpack@5.88.2) + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + dev: true + + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + chalk: 2.4.2 + dev: true + + /@babel/compat-data@7.22.20: + resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.23.0: + resolution: {integrity: sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/helpers': 7.23.1 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.0 + '@babel/types': 7.23.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.22.20 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.0): + resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.0): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: true + + /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.23.0): + resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.0): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + dev: true + + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.0): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-wrap-function@7.22.20: + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 + dev: true + + /@babel/helpers@7.23.1: + resolution: {integrity: sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.0 + '@babel/types': 7.23.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.0): + resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.0): + resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.0) + dev: true + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.0): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.0): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.0): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.0): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.0): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.0): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.0): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.0): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.0): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.0): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-async-generator-functions@7.22.15(@babel/core@7.23.0): + resolution: {integrity: sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.0) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) + dev: true + + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.0) + dev: true + + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.0) + dev: true + + /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.0): + resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: true + + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 + dev: true + + /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.0) + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.0) + dev: true + + /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.0): + resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) + dev: true + + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) + dev: true + + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) + dev: true + + /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) + dev: true + + /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.0): + resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.20 + '@babel/core': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.0) + dev: true + + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) + dev: true + + /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) + dev: true + + /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) + dev: true + + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.0): + resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.0) + dev: true + + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.0): + resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 + dev: true + + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.0): + resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/preset-env@7.22.20(@babel/core@7.23.0): + resolution: {integrity: sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.20 + '@babel/core': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.0) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.0) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.0) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-async-generator-functions': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.23.0) + '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.23.0) + '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.23.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.0) + '@babel/types': 7.23.0 + babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.23.0) + babel-plugin-polyfill-corejs3: 0.8.4(@babel/core@7.23.0) + babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.23.0) + core-js-compat: 3.33.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.0): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.23.0 + esutils: 2.0.3 + dev: true + + /@babel/regjsgen@0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + dev: true + + /@babel/runtime@7.23.1: + resolution: {integrity: sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + dev: true + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + dev: true + + /@babel/traverse@7.23.0: + resolution: {integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@discoveryjs/json-ext@0.5.7: + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + /@esbuild/aix-ppc64@0.21.5: + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.21.5: + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.21.5: + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.21.5: + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.21.5: + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.21.5: + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.21.5: + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.21.5: + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.21.5: + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.21.5: + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.21.5: + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.21.5: + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.21.5: + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.21.5: + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.21.5: + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.21.5: + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.21.5: + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.21.5: + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.21.5: + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.21.5: + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.21.5: + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.21.5: + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.21.5: + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.11.0: + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.22.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.57.0: + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + dev: true + + /@rollup/rollup-android-arm-eabi@4.20.0: + resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.20.0: + resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.20.0: + resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.20.0: + resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.20.0: + resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.20.0: + resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.20.0: + resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.20.0: + resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.20.0: + resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.20.0: + resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.20.0: + resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.20.0: + resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.20.0: + resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.20.0: + resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.20.0: + resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.20.0: + resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@sindresorhus/merge-streams@2.3.0: + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + dev: true + + /@types/eslint-scope@3.7.5: + resolution: {integrity: sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA==} + dependencies: + '@types/eslint': 8.44.3 + '@types/estree': 1.0.2 + + /@types/eslint@8.44.3: + resolution: {integrity: sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g==} + dependencies: + '@types/estree': 1.0.2 + '@types/json-schema': 7.0.13 + + /@types/estree@1.0.2: + resolution: {integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==} + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + + /@types/json-schema@7.0.13: + resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} + + /@types/node@20.8.2: + resolution: {integrity: sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w==} + + /@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0)(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 8.3.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/type-utils': 8.3.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 8.3.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.3.0 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@8.3.0(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.3.0 + debug: 4.3.4 + eslint: 8.57.0 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@8.3.0: + resolution: {integrity: sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/visitor-keys': 8.3.0 + dev: true + + /@typescript-eslint/type-utils@8.3.0(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4) + '@typescript-eslint/utils': 8.3.0(eslint@8.57.0)(typescript@5.5.4) + debug: 4.3.4 + ts-api-utils: 1.3.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - eslint + - supports-color + dev: true + + /@typescript-eslint/types@8.3.0: + resolution: {integrity: sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@typescript-eslint/typescript-estree@8.3.0(typescript@5.5.4): + resolution: {integrity: sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/visitor-keys': 8.3.0 + debug: 4.3.4 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@8.3.0(eslint@8.57.0)(typescript@5.5.4): + resolution: {integrity: sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@8.3.0: + resolution: {integrity: sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.3.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + + /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.88.2): + resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + dependencies: + webpack: 5.88.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.88.2) + + /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.88.2): + resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + dependencies: + webpack: 5.88.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.88.2) + + /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.88.2): + resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + dependencies: + webpack: 5.88.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.88.2) + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + /acorn-import-assertions@1.9.0(acorn@8.10.0): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.10.0 + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + dev: true + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + + /ajv-keywords@5.1.0(ajv@8.12.0): + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + dependencies: + ajv: 8.12.0 + fast-deep-equal: 3.1.3 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /approx-string-match@1.1.0: + resolution: {integrity: sha512-j1yQB9XhfGWsvTfHEuNsR/SrUT4XQDkAc0PEjMifyi97931LmNQyLsO6HbuvZ3HeMx+3Dvk8m8XGkUF+8lCeqw==} + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: false + + /arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + get-intrinsic: 1.2.1 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + dev: false + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: false + + /babel-loader@8.3.0(@babel/core@7.23.0)(webpack@5.88.2): + resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} + engines: {node: '>= 8.9'} + peerDependencies: + '@babel/core': ^7.0.0 + webpack: '>=2' + dependencies: + '@babel/core': 7.23.0 + find-cache-dir: 3.3.2 + loader-utils: 2.0.4 + make-dir: 3.1.0 + schema-utils: 2.7.1 + webpack: 5.88.2(webpack-cli@5.1.4) + dev: true + + /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.23.0): + resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.22.20 + '@babel/core': 7.23.0 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.23.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3@0.8.4(@babel/core@7.23.0): + resolution: {integrity: sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.23.0) + core-js-compat: 3.33.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.23.0): + resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.23.0) + transitivePeerDependencies: + - supports-color + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.4.542 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /caniuse-lite@1.0.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + /clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /copy-webpack-plugin@12.0.2(webpack@5.88.2): + resolution: {integrity: sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.1.0 + dependencies: + fast-glob: 3.3.2 + glob-parent: 6.0.2 + globby: 14.0.2 + normalize-path: 3.0.0 + schema-utils: 4.2.0 + serialize-javascript: 6.0.2 + webpack: 5.88.2(webpack-cli@5.1.4) + dev: true + + /core-js-compat@3.33.0: + resolution: {integrity: sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==} + dependencies: + browserslist: 4.22.1 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /css-selector-generator@3.6.6: + resolution: {integrity: sha512-tNy7zBawE2EjuR0Htl3AbY8ZQ5TJBt3YFNh8xIPkLahDtE1mmFKDp2uHF4TdByElpFnzNy3HbDF0ITazZ/Lp5w==} + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /define-data-property@1.1.0: + resolution: {integrity: sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + gopd: 1.0.1 + has-property-descriptors: 1.0.0 + dev: false + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.0 + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: false + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /electron-to-chromium@1.4.542: + resolution: {integrity: sha512-6+cpa00G09N3sfh2joln4VUXHquWrOFx3FLZqiVQvl45+zS9DskDBTPvob+BhvFRmTBkyDSk0vvLMMRo/qc6mQ==} + + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + dev: true + + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + /envinfo@7.10.0: + resolution: {integrity: sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==} + engines: {node: '>=4'} + hasBin: true + + /es-abstract@1.22.2: + resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.1 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.4 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.0.1 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.11 + dev: false + + /es-module-lexer@1.3.1: + resolution: {integrity: sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==} + + /es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.4 + has-tostringtag: 1.0.0 + dev: false + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: false + + /esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.11.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.22.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.3 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + dependencies: + reusify: 1.0.4 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.1.0 + dev: true + + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.1.0: + resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} + engines: {node: '>=12.0.0'} + dependencies: + flatted: 3.2.9 + keyv: 4.5.3 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: false + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + functions-have-names: 1.2.3 + dev: false + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: false + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.4 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: false + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@13.22.0: + resolution: {integrity: sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + dev: false + + /globby@14.0.2: + resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} + engines: {node: '>=18'} + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.2 + ignore: 5.3.2 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.1 + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.1 + dev: false + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: false + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: false + + /has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} + engines: {node: '>= 0.4.0'} + + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: false + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.4 + side-channel: 1.0.4 + dev: false + + /interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: false + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: false + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: false + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: false + + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.4 + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: false + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: false + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: false + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: false + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.11 + dev: false + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: false + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.8.2 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /keyv@4.5.3: + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + /loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: false + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: false + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + + /postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier@2.3.1: + resolution: {integrity: sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + dependencies: + resolve: 1.22.6 + + /regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: true + + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + dependencies: + '@babel/runtime': 7.23.1 + dev: true + + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + set-function-name: 2.0.1 + dev: false + + /regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.1 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: true + + /regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + /resolve@1.22.6: + resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@4.20.0: + resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.20.0 + '@rollup/rollup-android-arm64': 4.20.0 + '@rollup/rollup-darwin-arm64': 4.20.0 + '@rollup/rollup-darwin-x64': 4.20.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 + '@rollup/rollup-linux-arm-musleabihf': 4.20.0 + '@rollup/rollup-linux-arm64-gnu': 4.20.0 + '@rollup/rollup-linux-arm64-musl': 4.20.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 + '@rollup/rollup-linux-riscv64-gnu': 4.20.0 + '@rollup/rollup-linux-s390x-gnu': 4.20.0 + '@rollup/rollup-linux-x64-gnu': 4.20.0 + '@rollup/rollup-linux-x64-musl': 4.20.0 + '@rollup/rollup-win32-arm64-msvc': 4.20.0 + '@rollup/rollup-win32-ia32-msvc': 4.20.0 + '@rollup/rollup-win32-x64-msvc': 4.20.0 + fsevents: 2.3.3 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-regex: 1.1.4 + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /schema-utils@2.7.1: + resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} + engines: {node: '>= 8.9.0'} + dependencies: + '@types/json-schema': 7.0.13 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.13 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + /schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + dependencies: + '@types/json-schema': 7.0.13 + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + ajv-keywords: 5.1.0(ajv@8.12.0) + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + dependencies: + randombytes: 2.1.0 + dev: true + + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.0 + dev: false + + /shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + dev: false + + /slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + dev: true + + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + /source-map-loader@5.0.0(webpack@5.88.2): + resolution: {integrity: sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.72.1 + dependencies: + iconv-lite: 0.6.3 + source-map-js: 1.2.0 + webpack: 5.88.2(webpack-cli@5.1.4) + dev: false + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: false + + /string.prototype.matchall@4.0.10: + resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.5.1 + set-function-name: 2.0.1 + side-channel: 1.0.4 + dev: false + + /string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + dev: false + + /string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + dev: false + + /string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + /terser-webpack-plugin@5.3.9(webpack@5.88.2): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.19 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.21.0 + webpack: 5.88.2(webpack-cli@5.1.4) + + /terser@5.21.0: + resolution: {integrity: sha512-WtnFKrxu9kaoXuiZFSGrcAvvBqAdmKx0SFNmVNYdJamMu9yyN3I/QF0FbH4QcqJQ+y1CJnzxGIKH0cSj+FGYRw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.10.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /ts-api-utils@1.3.0(typescript@5.5.4): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.5.4 + dev: true + + /ts-loader@9.5.1(typescript@5.5.4)(webpack@5.88.2): + resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.15.0 + micromatch: 4.0.7 + semver: 7.5.4 + source-map: 0.7.4 + typescript: 5.5.4 + webpack: 5.88.2(webpack-cli@5.1.4) + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: false + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: false + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: false + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.12 + dev: false + + /typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: false + + /unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: true + + /unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: true + + /unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + + /vite@5.4.1: + resolution: {integrity: sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.21.5 + postcss: 8.4.41 + rollup: 4.20.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + /webpack-cli@5.1.4(webpack@5.88.2): + resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} + engines: {node: '>=14.15.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + webpack: 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.88.2) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.88.2) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.88.2) + colorette: 2.0.20 + commander: 10.0.1 + cross-spawn: 7.0.3 + envinfo: 7.10.0 + fastest-levenshtein: 1.0.16 + import-local: 3.1.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.88.2(webpack-cli@5.1.4) + webpack-merge: 5.9.0 + + /webpack-merge@5.9.0: + resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} + engines: {node: '>=10.0.0'} + dependencies: + clone-deep: 4.0.1 + wildcard: 2.0.1 + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + /webpack@5.88.2(webpack-cli@5.1.4): + resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.5 + '@types/estree': 1.0.2 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.10.0 + acorn-import-assertions: 1.9.0(acorn@8.10.0) + browserslist: 4.22.1 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.1 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(webpack@5.88.2) + watchpack: 2.4.0 + webpack-cli: 5.1.4(webpack@5.88.2) + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: false + + /which-typed-array@1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true diff --git a/readium/navigators/web/scripts/public/prepaginated-double-index.html b/readium/navigators/web/scripts/public/prepaginated-double-index.html new file mode 100644 index 0000000000..b6c044dbd9 --- /dev/null +++ b/readium/navigators/web/scripts/public/prepaginated-double-index.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + +
    + + + +
    + + + + diff --git a/readium/navigators/web/scripts/public/prepaginated-single-index.html b/readium/navigators/web/scripts/public/prepaginated-single-index.html new file mode 100644 index 0000000000..d72e5eb9a2 --- /dev/null +++ b/readium/navigators/web/scripts/public/prepaginated-single-index.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + + +
    + +
    + + + diff --git a/readium/navigators/web/scripts/src/common/types.ts b/readium/navigators/web/scripts/src/common/types.ts new file mode 100644 index 0000000000..eb20448800 --- /dev/null +++ b/readium/navigators/web/scripts/src/common/types.ts @@ -0,0 +1,18 @@ +export interface Size { + width: number + height: number +} + +export interface Margins { + top: number, + left: number, + bottom: number, + right: number +} + +export interface Insets { + top: number, + left: number, + bottom: number, + right: number +} diff --git a/readium/navigators/web/scripts/src/index-prepaginated-double.ts b/readium/navigators/web/scripts/src/index-prepaginated-double.ts new file mode 100644 index 0000000000..8ebb13290d --- /dev/null +++ b/readium/navigators/web/scripts/src/index-prepaginated-double.ts @@ -0,0 +1,59 @@ +// +// Copyright 2021 Readium Foundation. All rights reserved. +// Use of this source code is governed by the BSD-style license +// available in the top-level LICENSE file of the project. +// + +import { Insets, Size } from "./common/types"; +import { DoubleAreaManager } from "./prepaginated/double-area-manager"; +import { Fit } from "./util/fit"; + +namespace Layout { + + const leftIframe = document.getElementById("page-left") as HTMLIFrameElement; + + const rightIframe = document.getElementById("page-right") as HTMLIFrameElement; + + const metaViewport = document.querySelector("meta[name=viewport]") as HTMLMetaElement; + + const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport); + + export function loadSpread( + spread: { left?: string, right?: string } + ) { + manager.loadSpread(spread) + } + + export function setViewport( + viewporttWidth: number, + viewportHeight: number, + insetTop: number, + insetLeft: number, + insetBottom: number, + insetRight: number + ) { + const viewport: Size = { width: viewporttWidth, height: viewportHeight } + const insets: Insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight } + manager.setViewport(viewport, insets) + } + + export function setFit( + fit: string + ) { + if (fit != "contain" && fit != "width" && fit != "height") { + throw Error(`Invalid fit value: ${fit}`) + } + + manager.setFit(fit as Fit) + } +} + +declare global { + + interface Window { + + layout: any + } +} + +Window.prototype.layout = Layout diff --git a/readium/navigators/web/scripts/src/index-prepaginated-single.ts b/readium/navigators/web/scripts/src/index-prepaginated-single.ts new file mode 100644 index 0000000000..53a2e2ed72 --- /dev/null +++ b/readium/navigators/web/scripts/src/index-prepaginated-single.ts @@ -0,0 +1,75 @@ +// +// Copyright 2021 Readium Foundation. All rights reserved. +// Use of this source code is governed by the BSD-style license +// available in the top-level LICENSE file of the project. +// + +import { Insets, Size } from "./common/types"; +import { Fit } from "./util/fit"; +import { SingleAreaManager } from "./prepaginated/single-area-manager"; + +// Script used for the single spread wrapper HTML page for fixed layout resources. + + + +/*class WebListener implements SingleAreaManager.Listener{ + + onError(error: SingleAreaManager.Error): void { + console.error(error); + } +} + +//declare let listener: FixedPageManager.Listener +const listener = new WebListener();*/ + + +namespace Layout { + + const iframe = document.getElementById("page") as HTMLIFrameElement; + + const metaViewport = document.querySelector("meta[name=viewport]") as HTMLMetaElement; + + const manager = new SingleAreaManager(iframe, metaViewport); + + + export function loadResource( + url: string + ) { + manager.loadResource(url); + } + + export function setViewport( + viewporttWidth: number, + viewportHeight: number, + insetTop: number, + insetLeft: number, + insetBottom: number, + insetRight: number + + ) { + const viewport: Size = { width: viewporttWidth, height: viewportHeight }; + const insets: Insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight }; + manager.setViewport(viewport, insets); + } + + export function setFit( + fit: string + ) { + if (fit != "contain" && fit != "width" && fit != "height") { + throw Error(`Invalid fit value: ${fit}`) + } + + manager.setFit(fit as Fit); + } +} + +declare global { + + interface Window { + + layout: any + } +} + +Window.prototype.layout = Layout + diff --git a/readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts b/readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts new file mode 100644 index 0000000000..7a0fef9ea6 --- /dev/null +++ b/readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts @@ -0,0 +1,88 @@ + +import { Size, Insets } from "../common/types" +import { computeScale, Fit } from "../util/fit" +import { PageManager } from "./page-manager" +import { ViewportStringBuilder } from "../util/viewport" + +export class DoubleAreaManager { + + private readonly metaViewport: HTMLMetaElement + + private readonly leftPage: PageManager + + private readonly rightPage: PageManager + + private fit: Fit = Fit.Contain + + private insets: Insets = { top: 0, right: 0, bottom: 0, left: 0 } + + private viewport?: Size + + constructor( + leftIframe: HTMLIFrameElement, + rightIframe: HTMLIFrameElement, + metaViewport: HTMLMetaElement + ) { + const listener = { onIframeLoaded: () => { this.layout() } } + this.leftPage = new PageManager(leftIframe, listener) + this.rightPage = new PageManager(rightIframe, listener) + this.metaViewport = metaViewport + } + + loadSpread(spread: { left?: string, right?: string }) { + this.leftPage.hide() + this.rightPage.hide() + + if (spread.left) { + this.leftPage.loadPage(spread.left) + } + if (spread.right) { + this.rightPage.loadPage(spread.right) + } + } + + setViewport(size: Size, insets: Insets) { + if (this.viewport == size && this.insets == insets) { + return + } + + this.viewport = size + this.insets = insets + this.layout() + } + + setFit(fit: Fit) { + if (this.fit == fit) { + return + } + + this.fit = fit + this.layout() + } + + private layout() { + if (!this.viewport || (!this.leftPage.size && !this.rightPage.size)) { + return + } + + const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left } + this.leftPage.setMargins(leftMargins) + const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 } + this.rightPage.setMargins(rightMargins) + + const contentWidth = (this.leftPage.size?.width ?? 0) + (this.rightPage.size?.width ?? 0) + const contentHeight = Math.max(this.leftPage.size?.height ?? 0, this.rightPage.size?.height ?? 0) + const contentSize = { width: contentWidth, height: contentHeight } + const scale = computeScale(this.fit, contentSize, this.viewport) + + this.metaViewport.content = new ViewportStringBuilder() + .setInitialScale(scale) + .setMinimumScale(scale) + .setWidth(contentWidth) + .setHeight(contentHeight) + .build() + + this.leftPage.show() + this.rightPage.show() + } +} diff --git a/readium/navigators/web/scripts/src/prepaginated/page-manager.ts b/readium/navigators/web/scripts/src/prepaginated/page-manager.ts new file mode 100644 index 0000000000..c11412e392 --- /dev/null +++ b/readium/navigators/web/scripts/src/prepaginated/page-manager.ts @@ -0,0 +1,93 @@ +import {Margins, Size} from "../common/types" + +/** Manages a fixed layout resource embedded in an iframe. */ +export class PageManager { + + private readonly iframe: HTMLIFrameElement + + private readonly listener: PageManager.Listener + + private margins: Margins = { top: 0, right: 0, bottom: 0, left: 0 } + + size?: Size + + constructor(iframe: HTMLIFrameElement, listener: PageManager.Listener) { + if (!iframe.contentWindow) { + throw Error("Iframe argument must have been attached to DOM.") + } + + this.listener = listener + this.iframe = iframe + this.iframe.addEventListener("load", () => { this.onIframeLoaded() }) + } + + show() { + this.iframe.style.display = "unset" + } + + hide() { + this.iframe.style.display = "none" + } + + /** Sets page margins. */ + setMargins(margins: Margins) { + if (this.margins == margins) { + return + } + + this.iframe.style.marginTop = this.margins.top + "px" + this.iframe.style.marginLeft = this.margins.left + "px" + this.iframe.style.marginBottom = this.margins.bottom + "px" + this.iframe.style.marginRight = this.margins.right + "px" + } + + /** Loads page content. */ + loadPage(url: string) { + this.iframe.src = url + } + + private onIframeLoaded() { + const viewport = this.iframe.contentWindow!.document.querySelector("meta[name=viewport]") + if (viewport !instanceof HTMLMetaElement) { + return; + } + + const pageSize = this.parsePageSize(viewport as HTMLMetaElement); + if (!pageSize) { + //FIXME: handle edge case + return + } + this.iframe.style.width = pageSize.width + "px"; + this.iframe.style.height = pageSize.height + "px"; + this.size = pageSize + this.listener.onIframeLoaded() + } + + /** Parses the page size from the viewport meta tag of the loaded resource. */ + private parsePageSize(viewportMeta: HTMLMetaElement): Size | undefined { + const regex = /(\w+) *= *([^\s,]+)/g; + const properties = new Map(); + let match; + while ((match = regex.exec(viewportMeta.content))) { + if (match != null) { + properties.set(match[1], match[2]); + } + } + const width = parseFloat(properties.get("width")); + const height = parseFloat(properties.get("height")); + + if (width && height) { + return { width, height }; + } else { + return undefined + } + } +} + +export namespace PageManager { + + export interface Listener { + + onIframeLoaded(): void + } +} diff --git a/readium/navigators/web/scripts/src/prepaginated/single-area-manager.ts b/readium/navigators/web/scripts/src/prepaginated/single-area-manager.ts new file mode 100644 index 0000000000..e31969af9c --- /dev/null +++ b/readium/navigators/web/scripts/src/prepaginated/single-area-manager.ts @@ -0,0 +1,74 @@ +import { Insets, Size } from "../common/types" +import { computeScale, Fit } from "../util/fit" +import { PageManager } from "./page-manager" +import { ViewportStringBuilder } from "../util/viewport" + +export class SingleAreaManager { + + private readonly metaViewport: HTMLMetaElement + + private readonly page: PageManager + + private fit: Fit = Fit.Contain + + private insets: Insets = { top: 0, right: 0, bottom: 0, left: 0 } + + private viewport?: Size + + constructor(iframe: HTMLIFrameElement, metaViewport: HTMLMetaElement) { + this.metaViewport = metaViewport + const listener = { onIframeLoaded: () => { this.onIframeLoaded() } } + this.page = new PageManager(iframe, listener) + } + + setViewport(viewport: Size, insets: Insets) { + if (this.viewport == viewport && this.insets == insets) { + return + } + + this.viewport = viewport + this.insets = insets + this.layout() + } + + setFit(fit: Fit) { + if (this.fit == fit) { + return + } + + this.fit = fit + this.layout() + } + + loadResource(url: string) { + this.page.hide() + this.page.loadPage(url) + } + + private onIframeLoaded() { + if (!this.page.size) { + // FIXME: raise error + } else { + this.layout() + } + } + + private layout() { + if (!this.page.size || !this.viewport) { + return + } + + const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left } + this.page.setMargins(margins) + + const scale = computeScale(this.fit, this.page.size, this.viewport) + this.metaViewport.content = new ViewportStringBuilder() + .setInitialScale(scale) + .setMinimumScale(scale) + .setWidth(this.page.size.width) + .setHeight(this.page.size.height) + .build() + + this.page.show() + } +} diff --git a/readium/navigators/web/scripts/src/util/fit.ts b/readium/navigators/web/scripts/src/util/fit.ts new file mode 100644 index 0000000000..df6ed46bc1 --- /dev/null +++ b/readium/navigators/web/scripts/src/util/fit.ts @@ -0,0 +1,33 @@ +import { Size } from "../common/types"; + + +export const enum Fit { + Contain = "contain", + Width = "width", + Height = "height" +} + +export function computeScale(fit: Fit, content: Size, container: Size): number { + switch (fit) { + case Fit.Contain: + return fitContain(content, container); + case Fit.Width: + return fitWidth(content, container); + case Fit.Height: + return fitHeight(content, container); + } +} + +function fitContain(content: Size, container: Size): number { + const widthRatio = container.width / content.width; + const heightRatio = container.height / content.height; + return Math.min(widthRatio, heightRatio); +} + +function fitWidth(content: Size, container: Size): number { + return container.width / content.width; +} + +function fitHeight(content: Size, container: Size): number { + return container.height / content.height; +} diff --git a/readium/navigators/web/scripts/src/util/viewport.ts b/readium/navigators/web/scripts/src/util/viewport.ts new file mode 100644 index 0000000000..e27fd9249e --- /dev/null +++ b/readium/navigators/web/scripts/src/util/viewport.ts @@ -0,0 +1,53 @@ +export class ViewportStringBuilder{ + + private initialScale?: number + + private minimumScale?: number + + private width?: number + + private height?: number + + + setInitialScale(scale: number): ViewportStringBuilder { + this.initialScale = scale + return this + } + + setMinimumScale(scale: number): ViewportStringBuilder { + this.minimumScale = scale + return this + } + + setWidth(width: number): ViewportStringBuilder { + this.width = width + return this + } + + setHeight(height: number): ViewportStringBuilder { + this.height = height + return this + } + + build(): string { + const components: string[] = [] + + if (this.initialScale) { + components.push("initial-scale=" + this.initialScale) + } + + if (this.minimumScale) { + components.push("minimum-scale=" + this.minimumScale) + } + + if (this.width) { + components.push("width=" + this.width ) + } + + if (this.height) { + components.push("height=" + this.height ) + } + + return components.join(", ") + } +} diff --git a/readium/navigators/web/scripts/tsconfig.json b/readium/navigators/web/scripts/tsconfig.json new file mode 100644 index 0000000000..e7b0c5cf37 --- /dev/null +++ b/readium/navigators/web/scripts/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "outDir": "./dist/", + "noImplicitAny": true, + "module": "es6", + "target": "es6", + "jsx": "react", + "allowJs": true, + "moduleResolution": "node", + "strict": true + } +} diff --git a/readium/navigators/web/scripts/webpack.config.js b/readium/navigators/web/scripts/webpack.config.js new file mode 100644 index 0000000000..eabac50034 --- /dev/null +++ b/readium/navigators/web/scripts/webpack.config.js @@ -0,0 +1,39 @@ +const path = require("path"); +const CopyPlugin = require("copy-webpack-plugin"); + +module.exports = { + mode: "production", + devtool: "source-map", + entry: { + "prepaginated-single-script": "./src/index-prepaginated-single.ts", + "prepaginated-double-script": "./src/index-prepaginated-double.ts", + }, + resolve: { + // Add '.ts' and '.tsx' as resolvable extensions. + extensions: ["", ".webpack.js", ".web.js", ".ts", ".tsx", ".js"], + }, + module: { + rules: [ + // All files with a '.ts' or '.tsx' extension will be handled by 'ts-loader'. + { + test: /\.tsx?$/, + loader: "ts-loader", + }, + { + test: /\.m?js$/, + exclude: /node_modules/, + use: { + loader: "babel-loader", + options: { + presets: ["@babel/preset-env"], + }, + }, + }, + ], + }, + plugins: [ + new CopyPlugin({ + patterns: [{ from: "public" }], + }), + ], +}; diff --git a/readium/navigators/web/scripts/x b/readium/navigators/web/scripts/x new file mode 100644 index 0000000000..e69de29bb2 From c5e093da4c347ca44fedd08a0644fd63e1e1216b Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Tue, 3 Sep 2024 19:58:52 +0200 Subject: [PATCH 18/61] Support Page.CENTER --- readium/navigators/web/scripts/x | 0 .../readium/navigator/web/LayoutResolver.kt | 25 +++++++++++++------ .../readium/navigator/web/NavigatorFactory.kt | 8 +----- .../readium/navigator/web/NavigatorState.kt | 5 ++-- .../readium/navigator/web/NavigatorView.kt | 1 - .../web/{util => }/PagerNestedConnection.kt | 2 +- .../org/readium/navigator/web/Position.kt | 5 ---- .../web/webview/ComposableWebView.kt | 1 - .../WebViewScrollable2DState.kt | 3 +-- 9 files changed, 24 insertions(+), 26 deletions(-) delete mode 100644 readium/navigators/web/scripts/x rename readium/navigators/web/src/main/java/org/readium/navigator/web/{util => }/PagerNestedConnection.kt (98%) delete mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/Position.kt rename readium/navigators/web/src/main/java/org/readium/navigator/web/{util => webview}/WebViewScrollable2DState.kt (95%) diff --git a/readium/navigators/web/scripts/x b/readium/navigators/web/scripts/x deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/LayoutResolver.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/LayoutResolver.kt index d47c577093..6096eb5671 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/LayoutResolver.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/LayoutResolver.kt @@ -3,6 +3,7 @@ package org.readium.navigator.web import org.readium.navigator.web.preferences.NavigatorSettings import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.presentation.Presentation import org.readium.r2.shared.util.Url @ExperimentalReadiumApi @@ -11,7 +12,7 @@ internal class LayoutResolver( ) { data class Page( val url: Url, - val position: Position? + val page: Presentation.Page? ) sealed class Spread { @@ -41,15 +42,20 @@ internal class LayoutResolver( var pending: Page? = null for (page in readingOrder) { - when (page.position) { - Position.Left -> { + when (page.page) { + Presentation.Page.LEFT -> { pending?.let { add(Spread.Double(it.url, null)) } pending = page } - Position.Right -> { + Presentation.Page.RIGHT -> { add(Spread.Double(pending?.url, page.url)) pending = null } + Presentation.Page.CENTER -> { + pending?.let { add(Spread.Double(it.url, null)) } + pending = null + add(Spread.Single(page.url)) + } null -> { if (pending == null) { pending = page @@ -69,15 +75,20 @@ internal class LayoutResolver( var pending: Page? = null for (page in readingOrder) { - when (page.position) { - Position.Left -> { + when (page.page) { + Presentation.Page.LEFT -> { add(Spread.Double(page.url, pending?.url)) pending = null } - Position.Right -> { + Presentation.Page.RIGHT -> { pending?.let { add(Spread.Double(null, it.url)) } pending = page } + Presentation.Page.CENTER -> { + pending?.let { add(Spread.Double(null, it.url)) } + pending = null + add(Spread.Single(page.url)) + } null -> { if (pending == null) { pending = page diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt index f51b582a7f..87f26d45bd 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt @@ -18,7 +18,6 @@ import org.readium.r2.shared.publication.Link import org.readium.r2.shared.publication.Locator import org.readium.r2.shared.publication.Publication import org.readium.r2.shared.publication.indexOfFirstWithHref -import org.readium.r2.shared.publication.presentation.Presentation import org.readium.r2.shared.publication.presentation.page import org.readium.r2.shared.util.Try @@ -66,12 +65,7 @@ public class NavigatorFactory private constructor( val items = readingOrder.map { NavigatorState.ReadingOrder.Item( href = it.url(), - position = when (it.properties.page) { - Presentation.Page.LEFT -> Position.Left - Presentation.Page.RIGHT -> Position.Right - Presentation.Page.CENTER -> null - null -> null - } + page = it.properties.page ) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt index 9c891e2ef0..603ea82118 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt @@ -14,6 +14,7 @@ import org.readium.navigator.web.util.WebViewServer import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.Metadata +import org.readium.r2.shared.publication.presentation.Presentation import org.readium.r2.shared.util.Url @ExperimentalReadiumApi @@ -35,7 +36,7 @@ public class NavigatorState internal constructor( public data class Item( val href: Url, - val position: Position? + val page: Presentation.Page? ) } @@ -47,7 +48,7 @@ public class NavigatorState internal constructor( NavigatorSettingsResolver(publicationMetadata, defaults) private val layoutResolver = - LayoutResolver(readingOrder.items.map { LayoutResolver.Page(it.href, it.position) }) + LayoutResolver(readingOrder.items.map { LayoutResolver.Page(it.href, it.page) }) public val preferences: MutableState = mutableStateOf(initialPreferences) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt index 424ead6de8..4a24858c7c 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt @@ -20,7 +20,6 @@ import org.readium.navigator.web.spread.DoubleSpread import org.readium.navigator.web.spread.DoubleSpreadState import org.readium.navigator.web.spread.SingleSpread import org.readium.navigator.web.spread.SingleSpreadState -import org.readium.navigator.web.util.PagerNestedConnection import org.readium.navigator.web.util.WebViewServer import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/PagerNestedConnection.kt similarity index 98% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/PagerNestedConnection.kt index 64d8fb6b8d..ee5f443632 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/PagerNestedConnection.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/PagerNestedConnection.kt @@ -1,4 +1,4 @@ -package org.readium.navigator.web.util +package org.readium.navigator.web import androidx.compose.foundation.MutatePriority import androidx.compose.foundation.gestures.Orientation diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/Position.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/Position.kt deleted file mode 100644 index 0de5a6c8a3..0000000000 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/Position.kt +++ /dev/null @@ -1,5 +0,0 @@ -package org.readium.navigator.web - -public enum class Position { - Left, Right; -} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt index a8ade2b8fb..759f251530 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt @@ -33,7 +33,6 @@ import androidx.webkit.WebViewCompat import androidx.webkit.WebViewFeature import org.readium.navigator.web.gestures.Fling2DBehavior import org.readium.navigator.web.gestures.scrollable2D -import org.readium.navigator.web.util.WebViewScrollable2DState import org.readium.navigator.web.webview.LoadingState.Finished import org.readium.navigator.web.webview.LoadingState.Loading diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/WebViewScrollable2DState.kt similarity index 95% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/webview/WebViewScrollable2DState.kt index 92fe7de458..380efa9812 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewScrollable2DState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/WebViewScrollable2DState.kt @@ -1,4 +1,4 @@ -package org.readium.navigator.web.util +package org.readium.navigator.web.webview import androidx.compose.ui.geometry.Offset import kotlin.math.abs @@ -6,7 +6,6 @@ import kotlin.math.ceil import kotlin.math.sign import org.readium.navigator.web.gestures.DefaultScrollable2DState import org.readium.navigator.web.gestures.Scrollable2DState -import org.readium.navigator.web.webview.RelaxedWebView internal class WebViewScrollable2DState private constructor( private val webViewDeltaDispatcher: WebViewDeltaDispatcher From 38af22e6a2bb430ddf5329aa4a022da64399ac66 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Tue, 3 Sep 2024 20:24:52 +0200 Subject: [PATCH 19/61] Cosmetic changes --- .../readium/navigator/demo/DemoActivity.kt | 4 +- .../readium/navigator/demo/DemoViewModel.kt | 8 ++-- ...torView.kt => PrepaginatedWebNavigator.kt} | 36 +++++------------ ....kt => PrepaginatedWebNavigatorFactory.kt} | 40 ++++++++++--------- ...te.kt => PrepaginatedWebNavigatorState.kt} | 17 +++++--- .../web/{ => layout}/LayoutResolver.kt | 19 +-------- .../org/readium/navigator/web/layout/Page.kt | 9 +++++ .../readium/navigator/web/layout/Spread.kt | 15 +++++++ .../LoggingNestedScrollConnection.kt | 2 +- .../LoggingTargetedFlingBehavior.kt | 2 +- .../navigator/web/pager/NavigatorPager.kt | 40 +++++++++++++++++++ .../web/{ => pager}/PagerNestedConnection.kt | 2 +- .../navigator/web/spread/DoubleSpread.kt | 8 ++-- .../navigator/web/spread/SingleSpread.kt | 6 +-- .../navigator/web/util/WebViewServer.kt | 4 +- .../web/webapi/PrepaginatedDoubleApi.kt | 23 +++++++++-- .../web/webapi/PrepaginatedSingleApi.kt | 22 ++++++++-- 17 files changed, 163 insertions(+), 94 deletions(-) rename readium/navigators/web/src/main/java/org/readium/navigator/web/{NavigatorView.kt => PrepaginatedWebNavigator.kt} (71%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/{NavigatorFactory.kt => PrepaginatedWebNavigatorFactory.kt} (72%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/{NavigatorState.kt => PrepaginatedWebNavigatorState.kt} (79%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/{ => layout}/LayoutResolver.kt (89%) create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Page.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Spread.kt rename readium/navigators/web/src/main/java/org/readium/navigator/web/{logging => pager}/LoggingNestedScrollConnection.kt (97%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/{logging => pager}/LoggingTargetedFlingBehavior.kt (93%) create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/pager/NavigatorPager.kt rename readium/navigators/web/src/main/java/org/readium/navigator/web/{ => pager}/PagerNestedConnection.kt (98%) diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt index 2b309251a9..64ad1e46fd 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt @@ -36,7 +36,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import org.readium.navigator.demo.preferences.UserPreferences -import org.readium.navigator.web.NavigatorView +import org.readium.navigator.web.PrepaginatedWebNavigator import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.toAbsoluteUrl @@ -108,7 +108,7 @@ class DemoActivity : ComponentActivity() { } } - NavigatorView( + PrepaginatedWebNavigator( modifier = Modifier.fillMaxSize(), state = stateNow.navigatorState ) diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt index a2331017f3..53039d5df1 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt @@ -19,8 +19,8 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import org.readium.navigator.demo.preferences.PreferencesManager import org.readium.navigator.demo.preferences.UserPreferencesViewModel -import org.readium.navigator.web.NavigatorFactory -import org.readium.navigator.web.NavigatorState +import org.readium.navigator.web.PrepaginatedWebNavigatorFactory +import org.readium.navigator.web.PrepaginatedWebNavigatorState import org.readium.navigator.web.preferences.NavigatorPreferences import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl @@ -49,7 +49,7 @@ class DemoViewModel( ) : State data class Reader( - val navigatorState: NavigatorState, + val navigatorState: PrepaginatedWebNavigatorState, val preferencesViewModel: UserPreferencesViewModel ) : State } @@ -92,7 +92,7 @@ class DemoViewModel( return@launch } - val navigatorFactory = NavigatorFactory(getApplication(), publication) + val navigatorFactory = PrepaginatedWebNavigatorFactory(getApplication(), publication) ?: run { publication.close() val error = DebugError("Publication not supported") diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt similarity index 71% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt index 4a24858c7c..3608ba0820 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt @@ -1,11 +1,7 @@ package org.readium.navigator.web -import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.pager.HorizontalPager -import androidx.compose.foundation.pager.PagerDefaults -import androidx.compose.foundation.pager.PagerSnapDistance import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.runtime.remember @@ -14,8 +10,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Size import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.unit.LayoutDirection -import org.readium.navigator.web.logging.LoggingNestedScrollConnection -import org.readium.navigator.web.logging.LoggingTargetedFlingBehavior +import org.readium.navigator.web.layout.Spread +import org.readium.navigator.web.pager.NavigatorPager import org.readium.navigator.web.spread.DoubleSpread import org.readium.navigator.web.spread.DoubleSpreadState import org.readium.navigator.web.spread.SingleSpread @@ -26,34 +22,22 @@ import org.readium.r2.shared.ExperimentalReadiumApi @ExperimentalReadiumApi @Composable -public fun NavigatorView( +public fun PrepaginatedWebNavigator( modifier: Modifier, - state: NavigatorState + state: PrepaginatedWebNavigatorState ) { val pagerState = rememberPagerState { state.spreads.value.size } - val flingBehavior = LoggingTargetedFlingBehavior( - PagerDefaults.flingBehavior( - state = pagerState, - pagerSnapDistance = PagerSnapDistance.atMost(0) - ) - ) - val reverseLayout = LocalLayoutDirection.current.toReadingProgression() != state.settings.value.readingProgression - HorizontalPager( + NavigatorPager( modifier = modifier, - userScrollEnabled = false, state = pagerState, beyondViewportPageCount = 2, - reverseLayout = reverseLayout, - flingBehavior = flingBehavior, - pageNestedScrollConnection = LoggingNestedScrollConnection( - PagerNestedConnection(pagerState, flingBehavior, Orientation.Horizontal) - ) + reverseLayout = reverseLayout ) { BoxWithConstraints( modifier = Modifier.fillMaxSize(), @@ -62,10 +46,10 @@ public fun NavigatorView( val viewportState = rememberUpdatedState(Size(maxWidth.value, maxHeight.value)) when (val spread = state.spreads.value[it]) { - is LayoutResolver.Spread.Single -> { + is Spread.Single -> { val spreadState = remember { SingleSpreadState( - htmlData = state.fxlSpreadOne, + htmlData = state.preloadedData.prepaginatedSingleContent, publicationBaseUrl = WebViewServer.publicationBaseHref, webViewClient = state.webViewClient, spread = spread, @@ -76,10 +60,10 @@ public fun NavigatorView( SingleSpread(state = spreadState) } - is LayoutResolver.Spread.Double -> { + is Spread.Double -> { val spreadState = remember { DoubleSpreadState( - htmlData = state.fxlSpreadTwo, + htmlData = state.preloadedData.prepaginatedDoubleContent, publicationBaseUrl = WebViewServer.publicationBaseHref, webViewClient = state.webViewClient, spread = spread, diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt similarity index 72% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt index 87f26d45bd..307580f976 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorFactory.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt @@ -11,6 +11,8 @@ import org.readium.navigator.web.preferences.NavigatorDefaults import org.readium.navigator.web.preferences.NavigatorPreferences import org.readium.navigator.web.preferences.NavigatorPreferencesEditor import org.readium.navigator.web.util.WebViewServer +import org.readium.navigator.web.webapi.PrepaginatedDoubleApi +import org.readium.navigator.web.webapi.PrepaginatedSingleApi import org.readium.r2.navigator.extensions.normalizeLocator import org.readium.r2.shared.DelicateReadiumApi import org.readium.r2.shared.ExperimentalReadiumApi @@ -23,7 +25,7 @@ import org.readium.r2.shared.util.Try @ExperimentalReadiumApi @OptIn(DelicateReadiumApi::class) -public class NavigatorFactory private constructor( +public class PrepaginatedWebNavigatorFactory private constructor( private val application: Application, private val publication: Publication, private val defaults: NavigatorDefaults @@ -34,7 +36,7 @@ public class NavigatorFactory private constructor( public operator fun invoke( application: Application, publication: Publication - ): NavigatorFactory? { + ): PrepaginatedWebNavigatorFactory? { if (!publication.conformsTo(Publication.Profile.EPUB)) { return null } @@ -43,7 +45,7 @@ public class NavigatorFactory private constructor( return null } - return NavigatorFactory(application, publication, NavigatorDefaults()) + return PrepaginatedWebNavigatorFactory(application, publication, NavigatorDefaults()) } } @@ -61,9 +63,9 @@ public class NavigatorFactory private constructor( initialLocator: Locator? = null, initialPreferences: NavigatorPreferences? = null, readingOrder: List = publication.readingOrder - ): Try { + ): Try { val items = readingOrder.map { - NavigatorState.ReadingOrder.Item( + PrepaginatedWebNavigatorState.ReadingOrder.Item( href = it.url(), page = it.properties.page ) @@ -83,28 +85,28 @@ public class NavigatorFactory private constructor( onResourceLoadFailed = { _, _ -> } ) - val fxlSpreadOne = application.assets - .open("readium/navigators/web/prepaginated-single-index.html") - .bufferedReader() - .use { it.readText() } - .replace("{{ASSETS_URL}}", WebViewServer.assetUrl("readium/navigators/web").toString()) + val prepaginatedSingleContent = PrepaginatedSingleApi.getPageContent( + assetManager = application.assets, + assetsUrl = WebViewServer.assetUrl("readium/navigators/web")!! + ) - val fxlSpreadTwo = application.assets - .open("readium/navigators/web/prepaginated-double-index.html") - .bufferedReader() - .use { it.readText() } - .replace("{{ASSETS_URL}}", WebViewServer.assetUrl("readium/navigators/web").toString()) + val prepaginatedDoubleContent = PrepaginatedDoubleApi.getPageContent( + assetManager = application.assets, + assetsUrl = WebViewServer.assetUrl("readium/navigators/web")!! + ) val navigatorState = - NavigatorState( + PrepaginatedWebNavigatorState( publicationMetadata = publication.metadata, - readingOrder = NavigatorState.ReadingOrder(items), + readingOrder = PrepaginatedWebNavigatorState.ReadingOrder(items), initialPreferences = initialPreferences ?: NavigatorPreferences(), defaults = defaults, initialItem = initialIndex, webViewServer = webViewServer, - fxlSpreadOne = fxlSpreadOne, - fxlSpreadTwo = fxlSpreadTwo + preloadedData = PrepaginatedWebNavigatorState.PreloadedData( + prepaginatedSingleContent = prepaginatedSingleContent, + prepaginatedDoubleContent = prepaginatedDoubleContent + ) ) return Try.success(navigatorState) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt similarity index 79% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt index 603ea82118..549cb40276 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/NavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt @@ -5,6 +5,9 @@ import androidx.compose.runtime.Stable import androidx.compose.runtime.State import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.mutableStateOf +import org.readium.navigator.web.layout.LayoutResolver +import org.readium.navigator.web.layout.Page +import org.readium.navigator.web.layout.Spread import org.readium.navigator.web.preferences.NavigatorDefaults import org.readium.navigator.web.preferences.NavigatorPreferences import org.readium.navigator.web.preferences.NavigatorSettings @@ -20,16 +23,20 @@ import org.readium.r2.shared.util.Url @ExperimentalReadiumApi @Stable @Suppress("Unused_parameter") -public class NavigatorState internal constructor( +public class PrepaginatedWebNavigatorState internal constructor( publicationMetadata: Metadata, readingOrder: ReadingOrder, initialPreferences: NavigatorPreferences, defaults: NavigatorDefaults, initialItem: Int, internal val webViewServer: WebViewServer, - internal val fxlSpreadOne: String, - internal val fxlSpreadTwo: String + internal val preloadedData: PreloadedData ) { + + internal data class PreloadedData( + val prepaginatedSingleContent: String, + val prepaginatedDoubleContent: String + ) public data class ReadingOrder( val items: List ) { @@ -48,7 +55,7 @@ public class NavigatorState internal constructor( NavigatorSettingsResolver(publicationMetadata, defaults) private val layoutResolver = - LayoutResolver(readingOrder.items.map { LayoutResolver.Page(it.href, it.page) }) + LayoutResolver(readingOrder.items.map { Page(it.href, it.page) }) public val preferences: MutableState = mutableStateOf(initialPreferences) @@ -59,7 +66,7 @@ public class NavigatorState internal constructor( internal val webViewClient = WebViewClient(webViewServer) - internal val spreads: State> = + internal val spreads: State> = derivedStateOf { layoutResolver.layout(settings.value) } internal val fit: State = diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/LayoutResolver.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt similarity index 89% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/LayoutResolver.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt index 6096eb5671..9848acc46c 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/LayoutResolver.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt @@ -1,31 +1,14 @@ -package org.readium.navigator.web +package org.readium.navigator.web.layout import org.readium.navigator.web.preferences.NavigatorSettings import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.presentation.Presentation -import org.readium.r2.shared.util.Url @ExperimentalReadiumApi internal class LayoutResolver( private val readingOrder: List ) { - data class Page( - val url: Url, - val page: Presentation.Page? - ) - - sealed class Spread { - - data class Single( - val value: Url - ) : Spread() - - data class Double( - val left: Url?, - val right: Url? - ) : Spread() - } fun layout(settings: NavigatorSettings): List = if (settings.spreads) { diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Page.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Page.kt new file mode 100644 index 0000000000..4ab29e4f6e --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Page.kt @@ -0,0 +1,9 @@ +package org.readium.navigator.web.layout + +import org.readium.r2.shared.publication.presentation.Presentation +import org.readium.r2.shared.util.Url + +internal data class Page( + val url: Url, + val page: Presentation.Page? +) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Spread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Spread.kt new file mode 100644 index 0000000000..b0e73e068d --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Spread.kt @@ -0,0 +1,15 @@ +package org.readium.navigator.web.layout + +import org.readium.r2.shared.util.Url + +internal sealed class Spread { + + data class Single( + val page: Url + ) : Spread() + + data class Double( + val leftPage: Url?, + val rightPage: Url? + ) : Spread() +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/logging/LoggingNestedScrollConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/LoggingNestedScrollConnection.kt similarity index 97% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/logging/LoggingNestedScrollConnection.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/pager/LoggingNestedScrollConnection.kt index 0107352978..8fbe924f14 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/logging/LoggingNestedScrollConnection.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/LoggingNestedScrollConnection.kt @@ -1,4 +1,4 @@ -package org.readium.navigator.web.logging +package org.readium.navigator.web.pager import androidx.compose.ui.geometry.Offset import androidx.compose.ui.input.nestedscroll.NestedScrollConnection diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/logging/LoggingTargetedFlingBehavior.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/LoggingTargetedFlingBehavior.kt similarity index 93% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/logging/LoggingTargetedFlingBehavior.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/pager/LoggingTargetedFlingBehavior.kt index 2f792c590c..43b138fad3 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/logging/LoggingTargetedFlingBehavior.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/LoggingTargetedFlingBehavior.kt @@ -1,4 +1,4 @@ -package org.readium.navigator.web.logging +package org.readium.navigator.web.pager import androidx.compose.foundation.gestures.ScrollScope import androidx.compose.foundation.gestures.TargetedFlingBehavior diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/NavigatorPager.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/NavigatorPager.kt new file mode 100644 index 0000000000..939ef86151 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/NavigatorPager.kt @@ -0,0 +1,40 @@ +package org.readium.navigator.web.pager + +import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.PagerDefaults +import androidx.compose.foundation.pager.PagerScope +import androidx.compose.foundation.pager.PagerSnapDistance +import androidx.compose.foundation.pager.PagerState +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier + +@Composable +internal fun NavigatorPager( + modifier: Modifier = Modifier, + state: PagerState, + reverseLayout: Boolean, + beyondViewportPageCount: Int = 2, + pageContent: @Composable PagerScope.(Int) -> Unit + +) { + val flingBehavior = PagerDefaults.flingBehavior( + state = state, + pagerSnapDistance = PagerSnapDistance.atMost(0) + ) + + HorizontalPager( + modifier = modifier, + userScrollEnabled = false, + state = state, + beyondViewportPageCount = beyondViewportPageCount, + reverseLayout = reverseLayout, + flingBehavior = flingBehavior, + pageNestedScrollConnection = PagerNestedConnection( + state, + flingBehavior, + Orientation.Horizontal + ), + pageContent = pageContent + ) +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/PagerNestedConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/PagerNestedConnection.kt similarity index 98% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/PagerNestedConnection.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/pager/PagerNestedConnection.kt index ee5f443632..f5e4505d17 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/PagerNestedConnection.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/PagerNestedConnection.kt @@ -1,4 +1,4 @@ -package org.readium.navigator.web +package org.readium.navigator.web.pager import androidx.compose.foundation.MutatePriority import androidx.compose.foundation.gestures.Orientation diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleSpread.kt index 008d060e34..2fd9c11961 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleSpread.kt @@ -11,7 +11,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Size import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import org.readium.navigator.web.LayoutResolver +import org.readium.navigator.web.layout.Spread import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.webapi.PrepaginatedDoubleApi import org.readium.navigator.web.webview.LoadingState @@ -73,13 +73,13 @@ internal class DoubleSpreadState( val htmlData: String, val publicationBaseUrl: AbsoluteUrl, val webViewClient: WebViewClient, - val spread: LayoutResolver.Spread.Double, + val spread: Spread.Double, val fit: State, val viewport: State ) { val left: AbsoluteUrl? = - spread.left?.let { publicationBaseUrl.resolve(it) } + spread.leftPage?.let { publicationBaseUrl.resolve(it) } val right: AbsoluteUrl? = - spread.right?.let { publicationBaseUrl.resolve(it) } + spread.rightPage?.let { publicationBaseUrl.resolve(it) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleSpread.kt index e8082e6192..1b469ec3c8 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleSpread.kt @@ -11,7 +11,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Size import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import org.readium.navigator.web.LayoutResolver +import org.readium.navigator.web.layout.Spread import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.webapi.PrepaginatedSingleApi import org.readium.navigator.web.webview.LoadingState @@ -73,10 +73,10 @@ internal class SingleSpreadState( val htmlData: String, val publicationBaseUrl: AbsoluteUrl, val webViewClient: WebViewClient, - val spread: LayoutResolver.Spread.Single, + val spread: Spread.Single, val fit: State, val viewport: State ) { val url: AbsoluteUrl = - publicationBaseUrl.resolve(spread.value) + publicationBaseUrl.resolve(spread.page) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewServer.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewServer.kt index 7b9f3d2778..7633ff50db 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewServer.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/WebViewServer.kt @@ -15,7 +15,6 @@ import android.webkit.WebResourceResponse import androidx.webkit.WebViewAssetLoader import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.InternalReadiumApi import org.readium.r2.shared.publication.Href import org.readium.r2.shared.publication.Link @@ -34,7 +33,6 @@ import org.readium.r2.shared.util.resource.fallback /** * Serves the publication resources and application assets in the EPUB navigator web views. */ -@OptIn(ExperimentalReadiumApi::class) internal class WebViewServer( private val application: Application, private val publication: Publication, @@ -46,7 +44,7 @@ internal class WebViewServer( val publicationBaseHref = AbsoluteUrl("https://readium/publication/")!! val assetsBaseHref = AbsoluteUrl("https://readium/assets/")!! - fun assetUrl(path: String): Url? = + fun assetUrl(path: String): AbsoluteUrl? = Url.fromDecodedPath(path)?.let { assetsBaseHref.resolve(it) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt index 547813a1ce..8421c91885 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt @@ -1,19 +1,34 @@ package org.readium.navigator.web.webapi +import android.content.res.AssetManager import android.webkit.WebView -import org.readium.navigator.web.LayoutResolver +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.readium.navigator.web.layout.Spread import org.readium.navigator.web.util.WebViewServer import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.util.AbsoluteUrl @OptIn(ExperimentalReadiumApi::class) internal class PrepaginatedDoubleApi( private val webView: WebView ) { - fun loadSpread(spread: LayoutResolver.Spread.Double) { - val leftUrl = spread.left?.let { WebViewServer.publicationBaseHref.resolve(it) } - val rightUrl = spread.right?.let { WebViewServer.publicationBaseHref.resolve(it) } + companion object { + + suspend fun getPageContent(assetManager: AssetManager, assetsUrl: AbsoluteUrl): String = + withContext(Dispatchers.IO) { + assetManager.open("readium/navigators/web/prepaginated-double-index.html") + .bufferedReader() + .use { it.readText() } + .replace("{{ASSETS_URL}}", assetsUrl.toString()) + } + } + + fun loadSpread(spread: Spread.Double) { + val leftUrl = spread.leftPage?.let { WebViewServer.publicationBaseHref.resolve(it) } + val rightUrl = spread.rightPage?.let { WebViewServer.publicationBaseHref.resolve(it) } webView.evaluateJavascript("layout.loadSpread({ left: `$leftUrl`, right: `$rightUrl`});") {} } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt index 0af6406a24..77b293ae4e 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt @@ -1,17 +1,33 @@ package org.readium.navigator.web.webapi +import android.content.res.AssetManager import android.webkit.WebView -import org.readium.navigator.web.LayoutResolver +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.readium.navigator.web.layout.Spread import org.readium.navigator.web.util.WebViewServer import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.util.AbsoluteUrl @OptIn(ExperimentalReadiumApi::class) internal class PrepaginatedSingleApi( private val webView: WebView ) { - fun loadSpread(spread: LayoutResolver.Spread.Single) { - val resourceUrl = WebViewServer.publicationBaseHref.resolve(spread.value) + + companion object { + + suspend fun getPageContent(assetManager: AssetManager, assetsUrl: AbsoluteUrl): String = + withContext(Dispatchers.IO) { + assetManager.open("readium/navigators/web/prepaginated-single-index.html") + .bufferedReader() + .use { it.readText() } + .replace("{{ASSETS_URL}}", assetsUrl.toString()) + } + } + + fun loadSpread(spread: Spread.Single) { + val resourceUrl = WebViewServer.publicationBaseHref.resolve(spread.page) val script = "layout.loadResource(`$resourceUrl`);" webView.evaluateJavascript(script) {} } From c2d5f6989fbf47714778abad34d18c5837430309 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Fri, 6 Sep 2024 10:34:47 +0200 Subject: [PATCH 20/61] Fix various bugs --- gradle/libs.versions.toml | 12 +++++------ .../readium/navigator/demo/DemoViewModel.kt | 4 +++- .../dist/prepaginated-double-script.js | 2 +- .../dist/prepaginated-double-script.js.map | 2 +- .../dist/prepaginated-single-script.js | 2 +- .../dist/prepaginated-single-script.js.map | 2 +- .../src/prepaginated/double-area-manager.ts | 21 ++++++++++++++++--- .../scripts/src/prepaginated/page-manager.ts | 10 ++++++++- .../web/prepaginated-double-script.js | 2 +- .../web/prepaginated-double-script.js.map | 2 +- .../web/prepaginated-single-script.js | 2 +- .../web/prepaginated-single-script.js.map | 2 +- .../navigator/web/PrepaginatedWebNavigator.kt | 13 ++++++++++-- .../navigator/web/gestures/Scrollable2D.kt | 11 +--------- .../web/webapi/PrepaginatedDoubleApi.kt | 6 +++++- 15 files changed, 61 insertions(+), 32 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 882607acef..a79f75b028 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,12 +12,12 @@ androidx-cardview = "1.0.0" # Make sure to align with the Kotlin version # https://developer.android.com/jetpack/androidx/releases/compose-kotlin androidx-compose-compiler = "1.5.14" -androidx-compose-animation = "1.7.0-beta05" -androidx-compose-foundation = "1.7.0-beta05" -androidx-compose-material = "1.7.0-beta05" -androidx-compose-material3 = "1.3.0-beta04" -androidx-compose-runtime = "1.7.0-beta05" -androidx-compose-ui = "1.7.0-beta05" +androidx-compose-animation = "1.7.0" +androidx-compose-foundation = "1.7.0" +androidx-compose-material = "1.7.0" +androidx-compose-material3 = "1.3.0" +androidx-compose-runtime = "1.7.0" +androidx-compose-ui = "1.7.0" androidx-constraintlayout = "2.1.4" androidx-core = "1.13.1" androidx-datastore = "1.1.1" diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt index 53039d5df1..1af1b78709 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt @@ -116,7 +116,9 @@ class DemoViewModel( } preferencesViewModel.preferences - .onEach { navigatorState.preferences.value = it } + .onEach { + navigatorState.preferences.value = it + } .launchIn(viewModelScope) stateMutable.value = State.Reader(navigatorState, preferencesViewModel) diff --git a/readium/navigators/web/scripts/dist/prepaginated-double-script.js b/readium/navigators/web/scripts/dist/prepaginated-double-script.js index 7f31f62f99..7a46abfeb1 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-double-script.js +++ b/readium/navigators/web/scripts/dist/prepaginated-double-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){var t,e,s,h,n,a,o,r;if(!this.viewport||!this.leftPage.size&&!this.rightPage.size)return;const l={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(l);const g={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(g);const d=(null!==(e=null===(t=this.leftPage.size)||void 0===t?void 0:t.width)&&void 0!==e?e:0)+(null!==(h=null===(s=this.rightPage.size)||void 0===s?void 0:s.width)&&void 0!==h?h:0),m=Math.max(null!==(a=null===(n=this.leftPage.size)||void 0===n?void 0:n.height)&&void 0!==a?a:0,null!==(r=null===(o=this.rightPage.size)||void 0===o?void 0:o.height)&&void 0!==r?r:0),c={width:d,height:m},u=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,c,this.viewport);this.metaViewport.content=(new i).setInitialScale(u).setMinimumScale(u).setWidth(d).setHeight(m).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),n=new e(i,s,h);t.loadSpread=function(t){n.loadSpread(t)},t.setViewport=function(t,i,e,s,h,a){const o={width:t,height:i},r={top:e,left:s,bottom:h,right:a};n.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);n.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),a=parseFloat(e.get("height"));return h&&a?{width:h,height:a}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const e={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(e),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:h},r=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,a,this.viewport);this.metaViewport.content=(new i).setInitialScale(r).setMinimumScale(r).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),a=new e(i,s,h);t.loadSpread=function(t){a.loadSpread(t)},t.setViewport=function(t,i,e,s,h,r){const n={width:t,height:i},o={top:e,left:s,bottom:h,right:r};a.setViewport(n,o)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);a.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); //# sourceMappingURL=prepaginated-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map index dabdcd44ce..6638c72687 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map +++ b/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (viewport instanceof HTMLMetaElement) {\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n if (!this.viewport || (!this.leftPage.size && !this.rightPage.size)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n const contentWidth = ((_b = (_a = this.leftPage.size) === null || _a === void 0 ? void 0 : _a.width) !== null && _b !== void 0 ? _b : 0) + ((_d = (_c = this.rightPage.size) === null || _c === void 0 ? void 0 : _c.width) !== null && _d !== void 0 ? _d : 0);\n const contentHeight = Math.max((_f = (_e = this.leftPage.size) === null || _e === void 0 ? void 0 : _e.height) !== null && _f !== void 0 ? _f : 0, (_h = (_g = this.rightPage.size) === null || _g === void 0 ? void 0 : _g.height) !== null && _h !== void 0 ? _h : 0);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","width","height","size","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","_a","_b","_c","_d","_e","_f","_g","_h","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-double-script.js","mappings":"yBACO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAEhB,GADAC,KAAKC,QAAU,CAAEC,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,IAC/CP,EAAOQ,cACR,MAAMC,MAAM,mDAEhBP,KAAKD,SAAWA,EAChBC,KAAKF,OAASA,EACdE,KAAKF,OAAOU,iBAAiB,QAAQ,KAAQR,KAAKS,gBAAgB,GACtE,CACA,IAAAC,GACIV,KAAKF,OAAOa,MAAMC,QAAU,OAChC,CACA,IAAAC,GACIb,KAAKF,OAAOa,MAAMC,QAAU,MAChC,CAEA,UAAAE,CAAWb,GACHD,KAAKC,SAAWA,IAGpBD,KAAKF,OAAOa,MAAMI,UAAYf,KAAKC,QAAQC,IAAM,KACjDF,KAAKF,OAAOa,MAAMK,WAAahB,KAAKC,QAAQI,KAAO,KACnDL,KAAKF,OAAOa,MAAMM,aAAejB,KAAKC,QAAQG,OAAS,KACvDJ,KAAKF,OAAOa,MAAMO,YAAclB,KAAKC,QAAQE,MAAQ,KACzD,CAEA,QAAAgB,CAASC,GACLpB,KAAKF,OAAOuB,IAAMD,CACtB,CAEA,cAAAE,CAAeC,GACXvB,KAAKF,OAAOa,MAAMa,MAAQD,EAAKC,MAAQ,KACvCxB,KAAKF,OAAOa,MAAMc,OAASF,EAAKE,OAAS,KACzCzB,KAAKuB,KAAOA,CAChB,CACA,cAAAd,GACI,MAAMiB,EAAW1B,KAAKF,OAAOQ,cAAcqB,SAASC,cAAc,uBAClE,IAAKF,GAAYA,aAAoBG,gBAEjC,OAEJ,MAAMC,EAAW9B,KAAK+B,cAAcL,GAC/BI,IAIL9B,KAAKF,OAAOa,MAAMa,MAAQM,EAASN,MAAQ,KAC3CxB,KAAKF,OAAOa,MAAMc,OAASK,EAASL,OAAS,KAC7CzB,KAAKuB,KAAOO,EACZ9B,KAAKD,SAASU,iBAClB,CAEA,aAAAsB,CAAcC,GACV,MAAMC,EAAQ,uBACRC,EAAa,IAAIC,IACvB,IAAIC,EACJ,KAAQA,EAAQH,EAAMI,KAAKL,EAAaM,UACvB,MAATF,GACAF,EAAWK,IAAIH,EAAM,GAAIA,EAAM,IAGvC,MAAMZ,EAAQgB,WAAWN,EAAWO,IAAI,UAClChB,EAASe,WAAWN,EAAWO,IAAI,WACzC,OAAIjB,GAASC,EACF,CAAED,QAAOC,eAGhB,CAER,ECvEG,MAAMiB,EACT,eAAAC,CAAgBC,GAEZ,OADA5C,KAAK6C,aAAeD,EACb5C,IACX,CACA,eAAA8C,CAAgBF,GAEZ,OADA5C,KAAK+C,aAAeH,EACb5C,IACX,CACA,QAAAgD,CAASxB,GAEL,OADAxB,KAAKwB,MAAQA,EACNxB,IACX,CACA,SAAAiD,CAAUxB,GAEN,OADAzB,KAAKyB,OAASA,EACPzB,IACX,CACA,KAAAkD,GACI,MAAMC,EAAa,GAanB,OAZInD,KAAK6C,cACLM,EAAWC,KAAK,iBAAmBpD,KAAK6C,cAExC7C,KAAK+C,cACLI,EAAWC,KAAK,iBAAmBpD,KAAK+C,cAExC/C,KAAKwB,OACL2B,EAAWC,KAAK,SAAWpD,KAAKwB,OAEhCxB,KAAKyB,QACL0B,EAAWC,KAAK,UAAYpD,KAAKyB,QAE9B0B,EAAWE,KAAK,KAC3B,EC7BG,MAAMC,EACT,WAAAzD,CAAY0D,EAAYC,EAAaC,GACjCzD,KAAK0D,IAAM,UACX1D,KAAK2D,OAAS,CAAEzD,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GACnD,MAAMN,EAAW,CAAEU,eAAgB,KAAQT,KAAK4D,QAAQ,GACxD5D,KAAK6D,SAAW,IAAIjE,EAAY2D,EAAYxD,GAC5CC,KAAK8D,UAAY,IAAIlE,EAAY4D,EAAazD,GAC9CC,KAAKyD,aAAeA,CACxB,CACA,UAAAM,CAAWC,GACPhE,KAAK6D,SAAShD,OACdb,KAAK8D,UAAUjD,OACfb,KAAKgE,OAASA,EACVA,EAAO3D,MACPL,KAAK6D,SAAS1C,SAAS6C,EAAO3D,MAE9B2D,EAAO7D,OACPH,KAAK8D,UAAU3C,SAAS6C,EAAO7D,MAEvC,CACA,WAAA8D,CAAY1C,EAAMoC,GACV3D,KAAK0B,UAAYH,GAAQvB,KAAK2D,QAAUA,IAG5C3D,KAAK0B,SAAWH,EAChBvB,KAAK2D,OAASA,EACd3D,KAAK4D,SACT,CACA,MAAAM,CAAOR,GACC1D,KAAK0D,KAAOA,IAGhB1D,KAAK0D,IAAMA,EACX1D,KAAK4D,SACT,CACA,MAAAA,GACI,IAAK5D,KAAK0B,WACJ1B,KAAK6D,SAAStC,MAAQvB,KAAKgE,OAAO3D,OAClCL,KAAK8D,UAAUvC,MAAQvB,KAAKgE,OAAO7D,MACrC,OAEJ,MAAMgE,EAAc,CAAEjE,IAAKF,KAAK2D,OAAOzD,IAAKC,MAAO,EAAGC,OAAQJ,KAAK2D,OAAOvD,OAAQC,KAAML,KAAK2D,OAAOtD,MACpGL,KAAK6D,SAAS/C,WAAWqD,GACzB,MAAMC,EAAe,CAAElE,IAAKF,KAAK2D,OAAOzD,IAAKC,MAAOH,KAAK2D,OAAOxD,MAAOC,OAAQJ,KAAK2D,OAAOvD,OAAQC,KAAM,GACzGL,KAAK8D,UAAUhD,WAAWsD,GACrBpE,KAAKgE,OAAO7D,MAGPH,KAAKgE,OAAO3D,MAClBL,KAAK6D,SAASvC,eAAetB,KAAK8D,UAAUvC,MAH5CvB,KAAK8D,UAAUxC,eAAetB,KAAK6D,SAAStC,MAKhD,MAAM8C,EAAerE,KAAK6D,SAAStC,KAAKC,MAAQxB,KAAK8D,UAAUvC,KAAKC,MAC9D8C,EAAgBC,KAAKC,IAAIxE,KAAK6D,SAAStC,KAAKE,OAAQzB,KAAK8D,UAAUvC,KAAKE,QACxEgD,EAAc,CAAEjD,MAAO6C,EAAc5C,OAAQ6C,GAC7C1B,ECzDP,SAAsBc,EAAKpB,EAASoC,GACvC,OAAQhB,GACJ,IAAK,UACD,OAOZ,SAAoBpB,EAASoC,GACzB,MAAMC,EAAaD,EAAUlD,MAAQc,EAAQd,MACvCoD,EAAcF,EAAUjD,OAASa,EAAQb,OAC/C,OAAO8C,KAAKM,IAAIF,EAAYC,EAChC,CAXmBE,CAAWxC,EAASoC,GAC/B,IAAK,QACD,OAUZ,SAAkBpC,EAASoC,GACvB,OAAOA,EAAUlD,MAAQc,EAAQd,KACrC,CAZmBuD,CAASzC,EAASoC,GAC7B,IAAK,SACD,OAWZ,SAAmBpC,EAASoC,GACxB,OAAOA,EAAUjD,OAASa,EAAQb,MACtC,CAbmBuD,CAAU1C,EAASoC,GAEtC,CDgDsBO,CAAajF,KAAK0D,IAAKe,EAAazE,KAAK0B,UACvD1B,KAAKyD,aAAanB,SAAU,IAAII,GAC3BC,gBAAgBC,GAChBE,gBAAgBF,GAChBI,SAASqB,GACTpB,UAAUqB,GACVpB,QACLlD,KAAK6D,SAASnD,OACdV,KAAK8D,UAAUpD,MACnB,EE5DJ,IAAIwE,GACJ,SAAWA,GACP,MAAM3B,EAAa5B,SAASwD,eAAe,aACrC3B,EAAc7B,SAASwD,eAAe,cACtC1B,EAAe9B,SAASC,cAAc,uBACtCwD,EAAU,IAAI9B,EAAkBC,EAAYC,EAAaC,GAI/DyB,EAAOnB,WAHP,SAAoBC,GAChBoB,EAAQrB,WAAWC,EACvB,EAOAkB,EAAOjB,YALP,SAAqBoB,EAAgBC,EAAgBC,EAAUC,EAAWC,EAAaC,GACnF,MAAMhE,EAAW,CAAEF,MAAO6D,EAAgB5D,OAAQ6D,GAC5C3B,EAAS,CAAEzD,IAAKqF,EAAUlF,KAAMmF,EAAWpF,OAAQqF,EAAatF,MAAOuF,GAC7EN,EAAQnB,YAAYvC,EAAUiC,EAClC,EAQAuB,EAAOhB,OANP,SAAgBR,GACZ,GAAW,WAAPA,GAA2B,SAAPA,GAAyB,UAAPA,EACtC,MAAMnD,MAAM,sBAAsBmD,KAEtC0B,EAAQlB,OAAOR,EACnB,CAEH,CAtBD,CAsBGwB,IAAWA,EAAS,CAAC,IACxBS,OAAOC,UAAUhC,OAASsB,C","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-single-script.js b/readium/navigators/web/scripts/dist/prepaginated-single-script.js index a5d1c82d86..5830f23a2d 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-single-script.js +++ b/readium/navigators/web/scripts/dist/prepaginated-single-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); //# sourceMappingURL=prepaginated-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map index a8d60fb818..30ad060820 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map +++ b/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-single-script.js","mappings":"yBACO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAEhB,GADAC,KAAKC,QAAU,CAAEC,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,IAC/CP,EAAOQ,cACR,MAAMC,MAAM,mDAEhBP,KAAKD,SAAWA,EAChBC,KAAKF,OAASA,EACdE,KAAKF,OAAOU,iBAAiB,QAAQ,KAAQR,KAAKS,gBAAgB,GACtE,CACA,IAAAC,GACIV,KAAKF,OAAOa,MAAMC,QAAU,OAChC,CACA,IAAAC,GACIb,KAAKF,OAAOa,MAAMC,QAAU,MAChC,CAEA,UAAAE,CAAWb,GACHD,KAAKC,SAAWA,IAGpBD,KAAKF,OAAOa,MAAMI,UAAYf,KAAKC,QAAQC,IAAM,KACjDF,KAAKF,OAAOa,MAAMK,WAAahB,KAAKC,QAAQI,KAAO,KACnDL,KAAKF,OAAOa,MAAMM,aAAejB,KAAKC,QAAQG,OAAS,KACvDJ,KAAKF,OAAOa,MAAMO,YAAclB,KAAKC,QAAQE,MAAQ,KACzD,CAEA,QAAAgB,CAASC,GACLpB,KAAKF,OAAOuB,IAAMD,CACtB,CACA,cAAAX,GACI,MAAMa,EAAWtB,KAAKF,OAAOQ,cAAciB,SAASC,cAAc,uBAClE,GAAIF,aAAoBG,gBACpB,OAEJ,MAAMC,EAAW1B,KAAK2B,cAAcL,GAC/BI,IAIL1B,KAAKF,OAAOa,MAAMiB,MAAQF,EAASE,MAAQ,KAC3C5B,KAAKF,OAAOa,MAAMkB,OAASH,EAASG,OAAS,KAC7C7B,KAAK8B,KAAOJ,EACZ1B,KAAKD,SAASU,iBAClB,CAEA,aAAAkB,CAAcI,GACV,MAAMC,EAAQ,uBACRC,EAAa,IAAIC,IACvB,IAAIC,EACJ,KAAQA,EAAQH,EAAMI,KAAKL,EAAaM,UACvB,MAATF,GACAF,EAAWK,IAAIH,EAAM,GAAIA,EAAM,IAGvC,MAAMP,EAAQW,WAAWN,EAAWO,IAAI,UAClCX,EAASU,WAAWN,EAAWO,IAAI,WACzC,OAAIZ,GAASC,EACF,CAAED,QAAOC,eAGhB,CAER,EChEG,MAAMY,EACT,eAAAC,CAAgBC,GAEZ,OADA3C,KAAK4C,aAAeD,EACb3C,IACX,CACA,eAAA6C,CAAgBF,GAEZ,OADA3C,KAAK8C,aAAeH,EACb3C,IACX,CACA,QAAA+C,CAASnB,GAEL,OADA5B,KAAK4B,MAAQA,EACN5B,IACX,CACA,SAAAgD,CAAUnB,GAEN,OADA7B,KAAK6B,OAASA,EACP7B,IACX,CACA,KAAAiD,GACI,MAAMC,EAAa,GAanB,OAZIlD,KAAK4C,cACLM,EAAWC,KAAK,iBAAmBnD,KAAK4C,cAExC5C,KAAK8C,cACLI,EAAWC,KAAK,iBAAmBnD,KAAK8C,cAExC9C,KAAK4B,OACLsB,EAAWC,KAAK,SAAWnD,KAAK4B,OAEhC5B,KAAK6B,QACLqB,EAAWC,KAAK,UAAYnD,KAAK6B,QAE9BqB,EAAWE,KAAK,KAC3B,EC7BG,MAAMC,EACT,WAAAxD,CAAYC,EAAQwD,GAChBtD,KAAKuD,IAAM,UACXvD,KAAKwD,OAAS,CAAEtD,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GACnDL,KAAKsD,aAAeA,EACpB,MAAMvD,EAAW,CAAEU,eAAgB,KAAQT,KAAKS,gBAAgB,GAChET,KAAKyD,KAAO,IAAI7D,EAAYE,EAAQC,EACxC,CACA,WAAA2D,CAAYpC,EAAUkC,GACdxD,KAAKsB,UAAYA,GAAYtB,KAAKwD,QAAUA,IAGhDxD,KAAKsB,SAAWA,EAChBtB,KAAKwD,OAASA,EACdxD,KAAK2D,SACT,CACA,MAAAC,CAAOL,GACCvD,KAAKuD,KAAOA,IAGhBvD,KAAKuD,IAAMA,EACXvD,KAAK2D,SACT,CACA,YAAAE,CAAazC,GACTpB,KAAKyD,KAAK5C,OACVb,KAAKyD,KAAKtC,SAASC,EACvB,CACA,cAAAX,GACST,KAAKyD,KAAK3B,MAIX9B,KAAK2D,QAEb,CACA,MAAAA,GACI,IAAK3D,KAAKyD,KAAK3B,OAAS9B,KAAKsB,SACzB,OAEJ,MAAMrB,EAAU,CAAEC,IAAKF,KAAKwD,OAAOtD,IAAKC,MAAOH,KAAKwD,OAAOrD,MAAOC,OAAQJ,KAAKwD,OAAOpD,OAAQC,KAAML,KAAKwD,OAAOnD,MAChHL,KAAKyD,KAAK3C,WAAWb,GACrB,MAAM0C,EC5CP,SAAsBY,EAAKlB,EAASyB,GACvC,OAAQP,GACJ,IAAK,UACD,OAOZ,SAAoBlB,EAASyB,GACzB,MAAMC,EAAaD,EAAUlC,MAAQS,EAAQT,MACvCoC,EAAcF,EAAUjC,OAASQ,EAAQR,OAC/C,OAAOoC,KAAKC,IAAIH,EAAYC,EAChC,CAXmBG,CAAW9B,EAASyB,GAC/B,IAAK,QACD,OAUZ,SAAkBzB,EAASyB,GACvB,OAAOA,EAAUlC,MAAQS,EAAQT,KACrC,CAZmBwC,CAAS/B,EAASyB,GAC7B,IAAK,SACD,OAWZ,SAAmBzB,EAASyB,GACxB,OAAOA,EAAUjC,OAASQ,EAAQR,MACtC,CAbmBwC,CAAUhC,EAASyB,GAEtC,CDmCsBQ,CAAatE,KAAKuD,IAAKvD,KAAKyD,KAAK3B,KAAM9B,KAAKsB,UAC1DtB,KAAKsD,aAAajB,SAAU,IAAII,GAC3BC,gBAAgBC,GAChBE,gBAAgBF,GAChBI,SAAS/C,KAAKyD,KAAK3B,KAAKF,OACxBoB,UAAUhD,KAAKyD,KAAK3B,KAAKD,QACzBoB,QACLjD,KAAKyD,KAAK/C,MACd,EEpCJ,IAAI6D,GACJ,SAAWA,GACP,MAAMzE,EAASyB,SAASiD,eAAe,QACjClB,EAAe/B,SAASC,cAAc,uBACtCiD,EAAU,IAAIpB,EAAkBvD,EAAQwD,GAI9CiB,EAAOV,aAHP,SAAsBzC,GAClBqD,EAAQZ,aAAazC,EACzB,EAOAmD,EAAOb,YALP,SAAqBgB,EAAgBC,EAAgBC,EAAUC,EAAWC,EAAaC,GACnF,MAAMzD,EAAW,CAAEM,MAAO8C,EAAgB7C,OAAQ8C,GAC5CnB,EAAS,CAAEtD,IAAK0E,EAAUvE,KAAMwE,EAAWzE,OAAQ0E,EAAa3E,MAAO4E,GAC7EN,EAAQf,YAAYpC,EAAUkC,EAClC,EAQAe,EAAOX,OANP,SAAgBL,GACZ,GAAW,WAAPA,GAA2B,SAAPA,GAAyB,UAAPA,EACtC,MAAMhD,MAAM,sBAAsBgD,KAEtCkB,EAAQb,OAAOL,EACnB,CAEH,CArBD,CAqBGgB,IAAWA,EAAS,CAAC,IACxBS,OAAOC,UAAUtB,OAASY,C","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (viewport instanceof HTMLMetaElement) {\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","width","height","size","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts b/readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts index 7a0fef9ea6..ce41419eca 100644 --- a/readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts +++ b/readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts @@ -18,6 +18,8 @@ export class DoubleAreaManager { private viewport?: Size + private spread?: { left?: string, right?: string } + constructor( leftIframe: HTMLIFrameElement, rightIframe: HTMLIFrameElement, @@ -32,10 +34,12 @@ export class DoubleAreaManager { loadSpread(spread: { left?: string, right?: string }) { this.leftPage.hide() this.rightPage.hide() + this.spread = spread if (spread.left) { this.leftPage.loadPage(spread.left) } + if (spread.right) { this.rightPage.loadPage(spread.right) } @@ -61,7 +65,11 @@ export class DoubleAreaManager { } private layout() { - if (!this.viewport || (!this.leftPage.size && !this.rightPage.size)) { + if ( + !this.viewport || + (!this.leftPage.size && this.spread!.left) || + (!this.rightPage.size && this.spread!.right) + ) { return } @@ -70,8 +78,15 @@ export class DoubleAreaManager { const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 } this.rightPage.setMargins(rightMargins) - const contentWidth = (this.leftPage.size?.width ?? 0) + (this.rightPage.size?.width ?? 0) - const contentHeight = Math.max(this.leftPage.size?.height ?? 0, this.rightPage.size?.height ?? 0) + if (!this.spread!.right) { + this.rightPage.setPlaceholder(this.leftPage.size!) + + } else if (!this.spread!.left) { + this.leftPage.setPlaceholder(this.rightPage.size!) + } + + const contentWidth = this.leftPage.size!.width + this.rightPage.size!.width + const contentHeight = Math.max(this.leftPage.size!.height, this.rightPage.size!.height) const contentSize = { width: contentWidth, height: contentHeight } const scale = computeScale(this.fit, contentSize, this.viewport) diff --git a/readium/navigators/web/scripts/src/prepaginated/page-manager.ts b/readium/navigators/web/scripts/src/prepaginated/page-manager.ts index c11412e392..a350c31c16 100644 --- a/readium/navigators/web/scripts/src/prepaginated/page-manager.ts +++ b/readium/navigators/web/scripts/src/prepaginated/page-manager.ts @@ -46,9 +46,17 @@ export class PageManager { this.iframe.src = url } + /** Sets the size of this page without content. */ + setPlaceholder(size: Size) { + this.iframe.style.width = size.width + "px"; + this.iframe.style.height = size.height + "px"; + this.size = size + } + private onIframeLoaded() { const viewport = this.iframe.contentWindow!.document.querySelector("meta[name=viewport]") - if (viewport !instanceof HTMLMetaElement) { + if (!viewport || viewport !instanceof HTMLMetaElement) { + //FIXME: handle edge case return; } diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js index 7f31f62f99..7a46abfeb1 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){var t,e,s,h,n,a,o,r;if(!this.viewport||!this.leftPage.size&&!this.rightPage.size)return;const l={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(l);const g={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(g);const d=(null!==(e=null===(t=this.leftPage.size)||void 0===t?void 0:t.width)&&void 0!==e?e:0)+(null!==(h=null===(s=this.rightPage.size)||void 0===s?void 0:s.width)&&void 0!==h?h:0),m=Math.max(null!==(a=null===(n=this.leftPage.size)||void 0===n?void 0:n.height)&&void 0!==a?a:0,null!==(r=null===(o=this.rightPage.size)||void 0===o?void 0:o.height)&&void 0!==r?r:0),c={width:d,height:m},u=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,c,this.viewport);this.metaViewport.content=(new i).setInitialScale(u).setMinimumScale(u).setWidth(d).setHeight(m).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),n=new e(i,s,h);t.loadSpread=function(t){n.loadSpread(t)},t.setViewport=function(t,i,e,s,h,a){const o={width:t,height:i},r={top:e,left:s,bottom:h,right:a};n.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);n.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),a=parseFloat(e.get("height"));return h&&a?{width:h,height:a}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const e={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(e),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:h},r=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,a,this.viewport);this.metaViewport.content=(new i).setInitialScale(r).setMinimumScale(r).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),a=new e(i,s,h);t.loadSpread=function(t){a.loadSpread(t)},t.setViewport=function(t,i,e,s,h,r){const n={width:t,height:i},o={top:e,left:s,bottom:h,right:r};a.setViewport(n,o)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);a.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); //# sourceMappingURL=prepaginated-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map index dabdcd44ce..6638c72687 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (viewport instanceof HTMLMetaElement) {\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n if (!this.viewport || (!this.leftPage.size && !this.rightPage.size)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n const contentWidth = ((_b = (_a = this.leftPage.size) === null || _a === void 0 ? void 0 : _a.width) !== null && _b !== void 0 ? _b : 0) + ((_d = (_c = this.rightPage.size) === null || _c === void 0 ? void 0 : _c.width) !== null && _d !== void 0 ? _d : 0);\n const contentHeight = Math.max((_f = (_e = this.leftPage.size) === null || _e === void 0 ? void 0 : _e.height) !== null && _f !== void 0 ? _f : 0, (_h = (_g = this.rightPage.size) === null || _g === void 0 ? void 0 : _g.height) !== null && _h !== void 0 ? _h : 0);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","width","height","size","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","_a","_b","_c","_d","_e","_f","_g","_h","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js index a5d1c82d86..5830f23a2d 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); //# sourceMappingURL=prepaginated-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map index a8d60fb818..30ad060820 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-single-script.js","mappings":"yBACO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAEhB,GADAC,KAAKC,QAAU,CAAEC,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,IAC/CP,EAAOQ,cACR,MAAMC,MAAM,mDAEhBP,KAAKD,SAAWA,EAChBC,KAAKF,OAASA,EACdE,KAAKF,OAAOU,iBAAiB,QAAQ,KAAQR,KAAKS,gBAAgB,GACtE,CACA,IAAAC,GACIV,KAAKF,OAAOa,MAAMC,QAAU,OAChC,CACA,IAAAC,GACIb,KAAKF,OAAOa,MAAMC,QAAU,MAChC,CAEA,UAAAE,CAAWb,GACHD,KAAKC,SAAWA,IAGpBD,KAAKF,OAAOa,MAAMI,UAAYf,KAAKC,QAAQC,IAAM,KACjDF,KAAKF,OAAOa,MAAMK,WAAahB,KAAKC,QAAQI,KAAO,KACnDL,KAAKF,OAAOa,MAAMM,aAAejB,KAAKC,QAAQG,OAAS,KACvDJ,KAAKF,OAAOa,MAAMO,YAAclB,KAAKC,QAAQE,MAAQ,KACzD,CAEA,QAAAgB,CAASC,GACLpB,KAAKF,OAAOuB,IAAMD,CACtB,CACA,cAAAX,GACI,MAAMa,EAAWtB,KAAKF,OAAOQ,cAAciB,SAASC,cAAc,uBAClE,GAAIF,aAAoBG,gBACpB,OAEJ,MAAMC,EAAW1B,KAAK2B,cAAcL,GAC/BI,IAIL1B,KAAKF,OAAOa,MAAMiB,MAAQF,EAASE,MAAQ,KAC3C5B,KAAKF,OAAOa,MAAMkB,OAASH,EAASG,OAAS,KAC7C7B,KAAK8B,KAAOJ,EACZ1B,KAAKD,SAASU,iBAClB,CAEA,aAAAkB,CAAcI,GACV,MAAMC,EAAQ,uBACRC,EAAa,IAAIC,IACvB,IAAIC,EACJ,KAAQA,EAAQH,EAAMI,KAAKL,EAAaM,UACvB,MAATF,GACAF,EAAWK,IAAIH,EAAM,GAAIA,EAAM,IAGvC,MAAMP,EAAQW,WAAWN,EAAWO,IAAI,UAClCX,EAASU,WAAWN,EAAWO,IAAI,WACzC,OAAIZ,GAASC,EACF,CAAED,QAAOC,eAGhB,CAER,EChEG,MAAMY,EACT,eAAAC,CAAgBC,GAEZ,OADA3C,KAAK4C,aAAeD,EACb3C,IACX,CACA,eAAA6C,CAAgBF,GAEZ,OADA3C,KAAK8C,aAAeH,EACb3C,IACX,CACA,QAAA+C,CAASnB,GAEL,OADA5B,KAAK4B,MAAQA,EACN5B,IACX,CACA,SAAAgD,CAAUnB,GAEN,OADA7B,KAAK6B,OAASA,EACP7B,IACX,CACA,KAAAiD,GACI,MAAMC,EAAa,GAanB,OAZIlD,KAAK4C,cACLM,EAAWC,KAAK,iBAAmBnD,KAAK4C,cAExC5C,KAAK8C,cACLI,EAAWC,KAAK,iBAAmBnD,KAAK8C,cAExC9C,KAAK4B,OACLsB,EAAWC,KAAK,SAAWnD,KAAK4B,OAEhC5B,KAAK6B,QACLqB,EAAWC,KAAK,UAAYnD,KAAK6B,QAE9BqB,EAAWE,KAAK,KAC3B,EC7BG,MAAMC,EACT,WAAAxD,CAAYC,EAAQwD,GAChBtD,KAAKuD,IAAM,UACXvD,KAAKwD,OAAS,CAAEtD,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GACnDL,KAAKsD,aAAeA,EACpB,MAAMvD,EAAW,CAAEU,eAAgB,KAAQT,KAAKS,gBAAgB,GAChET,KAAKyD,KAAO,IAAI7D,EAAYE,EAAQC,EACxC,CACA,WAAA2D,CAAYpC,EAAUkC,GACdxD,KAAKsB,UAAYA,GAAYtB,KAAKwD,QAAUA,IAGhDxD,KAAKsB,SAAWA,EAChBtB,KAAKwD,OAASA,EACdxD,KAAK2D,SACT,CACA,MAAAC,CAAOL,GACCvD,KAAKuD,KAAOA,IAGhBvD,KAAKuD,IAAMA,EACXvD,KAAK2D,SACT,CACA,YAAAE,CAAazC,GACTpB,KAAKyD,KAAK5C,OACVb,KAAKyD,KAAKtC,SAASC,EACvB,CACA,cAAAX,GACST,KAAKyD,KAAK3B,MAIX9B,KAAK2D,QAEb,CACA,MAAAA,GACI,IAAK3D,KAAKyD,KAAK3B,OAAS9B,KAAKsB,SACzB,OAEJ,MAAMrB,EAAU,CAAEC,IAAKF,KAAKwD,OAAOtD,IAAKC,MAAOH,KAAKwD,OAAOrD,MAAOC,OAAQJ,KAAKwD,OAAOpD,OAAQC,KAAML,KAAKwD,OAAOnD,MAChHL,KAAKyD,KAAK3C,WAAWb,GACrB,MAAM0C,EC5CP,SAAsBY,EAAKlB,EAASyB,GACvC,OAAQP,GACJ,IAAK,UACD,OAOZ,SAAoBlB,EAASyB,GACzB,MAAMC,EAAaD,EAAUlC,MAAQS,EAAQT,MACvCoC,EAAcF,EAAUjC,OAASQ,EAAQR,OAC/C,OAAOoC,KAAKC,IAAIH,EAAYC,EAChC,CAXmBG,CAAW9B,EAASyB,GAC/B,IAAK,QACD,OAUZ,SAAkBzB,EAASyB,GACvB,OAAOA,EAAUlC,MAAQS,EAAQT,KACrC,CAZmBwC,CAAS/B,EAASyB,GAC7B,IAAK,SACD,OAWZ,SAAmBzB,EAASyB,GACxB,OAAOA,EAAUjC,OAASQ,EAAQR,MACtC,CAbmBwC,CAAUhC,EAASyB,GAEtC,CDmCsBQ,CAAatE,KAAKuD,IAAKvD,KAAKyD,KAAK3B,KAAM9B,KAAKsB,UAC1DtB,KAAKsD,aAAajB,SAAU,IAAII,GAC3BC,gBAAgBC,GAChBE,gBAAgBF,GAChBI,SAAS/C,KAAKyD,KAAK3B,KAAKF,OACxBoB,UAAUhD,KAAKyD,KAAK3B,KAAKD,QACzBoB,QACLjD,KAAKyD,KAAK/C,MACd,EEpCJ,IAAI6D,GACJ,SAAWA,GACP,MAAMzE,EAASyB,SAASiD,eAAe,QACjClB,EAAe/B,SAASC,cAAc,uBACtCiD,EAAU,IAAIpB,EAAkBvD,EAAQwD,GAI9CiB,EAAOV,aAHP,SAAsBzC,GAClBqD,EAAQZ,aAAazC,EACzB,EAOAmD,EAAOb,YALP,SAAqBgB,EAAgBC,EAAgBC,EAAUC,EAAWC,EAAaC,GACnF,MAAMzD,EAAW,CAAEM,MAAO8C,EAAgB7C,OAAQ8C,GAC5CnB,EAAS,CAAEtD,IAAK0E,EAAUvE,KAAMwE,EAAWzE,OAAQ0E,EAAa3E,MAAO4E,GAC7EN,EAAQf,YAAYpC,EAAUkC,EAClC,EAQAe,EAAOX,OANP,SAAgBL,GACZ,GAAW,WAAPA,GAA2B,SAAPA,GAAyB,UAAPA,EACtC,MAAMhD,MAAM,sBAAsBgD,KAEtCkB,EAAQb,OAAOL,EACnB,CAEH,CArBD,CAqBGgB,IAAWA,EAAS,CAAC,IACxBS,OAAOC,UAAUtB,OAASY,C","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (viewport instanceof HTMLMetaElement) {\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","width","height","size","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt index 3608ba0820..ef499d9022 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt @@ -19,6 +19,7 @@ import org.readium.navigator.web.spread.SingleSpreadState import org.readium.navigator.web.util.WebViewServer import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi +import timber.log.Timber @ExperimentalReadiumApi @Composable @@ -38,14 +39,22 @@ public fun PrepaginatedWebNavigator( state = pagerState, beyondViewportPageCount = 2, reverseLayout = reverseLayout - ) { + ) { index -> + BoxWithConstraints( modifier = Modifier.fillMaxSize(), propagateMinConstraints = true ) { val viewportState = rememberUpdatedState(Size(maxWidth.value, maxHeight.value)) - when (val spread = state.spreads.value[it]) { + // For some reason, index can be higher than the value of state.spreads.value.size + // at this point. Try to skip composition of those extra items. + if (index >= state.spreads.value.size) { + Timber.e("Compose bug") + return@BoxWithConstraints + } + + when (val spread = state.spreads.value[index]) { is Spread.Single -> { val spreadState = remember { SingleSpreadState( diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt index a99e7fcba1..29ee52dc36 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/gestures/Scrollable2D.kt @@ -62,7 +62,6 @@ import kotlin.coroutines.cancellation.CancellationException import kotlin.math.abs import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import timber.log.Timber /** * Configure touch scrolling and flinging for the UI element in a single [Orientation]. @@ -287,11 +286,9 @@ private class Scrollable2DNode( override suspend fun drag( forEachDelta: suspend ((dragDelta: DragEvent.DragDelta) -> Unit) -> Unit ) { - Timber.d("drag") with(scrollingLogic) { scroll(scrollPriority = MutatePriority.UserInput) { forEachDelta { - Timber.d("forEachDelta ${it.delta} $this@with") scrollByWithOverscroll( it.delta, source = NestedScrollSource.UserInput @@ -544,7 +541,6 @@ internal class ScrollingLogic( private fun Scroll2DScope.performScroll(delta: Offset, source: NestedScrollSource): Offset { val consumedByPreScroll = nestedScrollDispatcher.dispatchPreScroll(delta, source) - Timber.d("ConsumedByPreScroll $consumedByPreScroll") val scrollAvailableAfterPreScroll = delta - consumedByPreScroll @@ -554,7 +550,6 @@ internal class ScrollingLogic( // Consume on a single axis. val consumedBySelfScroll = scrollBy(deltaForSelfScroll).reverseIfNeeded() - Timber.d("ConsumedBySelfScroll $consumedBySelfScroll") val deltaAvailableAfterScroll = scrollAvailableAfterPreScroll - consumedBySelfScroll val consumedByPostScroll = nestedScrollDispatcher.dispatchPostScroll( @@ -562,7 +557,7 @@ internal class ScrollingLogic( deltaAvailableAfterScroll, source ) - Timber.d("ConsumedByPostScroll $consumedByPostScroll") + return consumedByPreScroll + consumedBySelfScroll + consumedByPostScroll } @@ -587,8 +582,6 @@ internal class ScrollingLogic( val velocityLeft = doFlingAnimation(available) - Timber.d("dispatchPostFling available $available left $velocityLeft") - val consumedPost = nestedScrollDispatcher.dispatchPostFling( (available - velocityLeft), @@ -732,14 +725,12 @@ internal class DefaultFling2DBehavior( animationState.animateDecay(flingDecay) { val delta = value - lastValue val consumed = scrollBy(delta) - Timber.d("animationStep $delta $consumed") lastValue = value velocityLeft = this.velocity // avoid rounding errors and stop if anything is unconsumed on both axes val unconsumedX = abs(delta.x) <= 0.5f || abs(delta.x - consumed.x) > 0.5f val unconsumedY = abs(delta.y) <= 0.5f || abs(delta.y - consumed.y) > 0.5f if (hasStarted && unconsumedX && unconsumedY) { - Timber.d("delta $delta consumed $consumed") this.cancelAnimation() } lastAnimationCycleCount++ diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt index 8421c91885..6844c2c4c1 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt @@ -29,7 +29,11 @@ internal class PrepaginatedDoubleApi( fun loadSpread(spread: Spread.Double) { val leftUrl = spread.leftPage?.let { WebViewServer.publicationBaseHref.resolve(it) } val rightUrl = spread.rightPage?.let { WebViewServer.publicationBaseHref.resolve(it) } - webView.evaluateJavascript("layout.loadSpread({ left: `$leftUrl`, right: `$rightUrl`});") {} + val argument = buildList { + leftUrl?.let { add("left: `$it`") } + rightUrl?.let { add("right: `$it`") } + }.joinToString(separator = ", ", prefix = "{ ", postfix = " }") + webView.evaluateJavascript("layout.loadSpread($argument);") {} } fun setViewport(width: Float, height: Float) { From c2cdf383f81b97ec4612bb72274da25b5d1f8b11 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Tue, 10 Sep 2024 10:42:35 +0200 Subject: [PATCH 21/61] Fix vertical scrolling bug --- .../web/pager/PagerNestedConnection.kt | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/PagerNestedConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/PagerNestedConnection.kt index f5e4505d17..f8abd2870f 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/PagerNestedConnection.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/PagerNestedConnection.kt @@ -50,21 +50,7 @@ internal class PagerNestedConnection( } override suspend fun onPreFling(available: Velocity): Velocity { - if (state.layoutInfo.visiblePagesInfo.size <= 1) { - return Velocity.Zero - } - var remaining: Float = available.x - state.scroll(scrollPriority = MutatePriority.PreventUserInput) { - with(flingBehavior) { - remaining = -performFling(-available.x) - } - } - - if ((available.x - remaining).isNaN()) { - return available - } - - return Velocity(available.x - remaining, available.y) + return Velocity.Zero } override fun onPostScroll( @@ -81,9 +67,6 @@ internal class PagerNestedConnection( available: Velocity ): Velocity { var remaining = available.x - if (state.isScrollInProgress) { - return available - } state.scroll(scrollPriority = MutatePriority.Default) { with(flingBehavior) { From 3242b37eb9764c2d8f5b9dfdfcafbecd60da981d Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Thu, 12 Sep 2024 15:36:04 +0200 Subject: [PATCH 22/61] Renaming --- .../readium/navigator/demo/DemoViewModel.kt | 6 ++-- .../demo/preferences/UserPreferences.kt | 4 +-- .../web/PrepaginatedWebNavigatorFactory.kt | 24 ++++++++------- .../web/PrepaginatedWebNavigatorState.kt | 18 +++++------ .../navigator/web/layout/LayoutResolver.kt | 4 +-- ...kt => PrepaginatedWebNavigatorDefaults.kt} | 2 +- ...=> PrepaginatedWebNavigatorPreferences.kt} | 8 ++--- ...paginatedWebNavigatorPreferencesEditor.kt} | 30 ++++++++++--------- ...aginatedWebNavigatorPreferencesFilters.kt} | 14 ++++----- ...kt => PrepaginatedWebNavigatorSettings.kt} | 2 +- ...epaginatedWebNavigatorSettingsResolver.kt} | 8 ++--- 11 files changed, 63 insertions(+), 57 deletions(-) rename readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/{NavigatorDefaults.kt => PrepaginatedWebNavigatorDefaults.kt} (87%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/{NavigatorPreferences.kt => PrepaginatedWebNavigatorPreferences.kt} (72%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/{NavigatorPreferencesEditor.kt => PrepaginatedWebNavigatorPreferencesEditor.kt} (72%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/{NavigatorPreferencesFilters.kt => PrepaginatedWebNavigatorPreferencesFilters.kt} (56%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/{NavigatorSettings.kt => PrepaginatedWebNavigatorSettings.kt} (88%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/{NavigatorSettingsResolver.kt => PrepaginatedWebNavigatorSettingsResolver.kt} (80%) diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt index 1af1b78709..9c070fd5b5 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt @@ -21,7 +21,7 @@ import org.readium.navigator.demo.preferences.PreferencesManager import org.readium.navigator.demo.preferences.UserPreferencesViewModel import org.readium.navigator.web.PrepaginatedWebNavigatorFactory import org.readium.navigator.web.PrepaginatedWebNavigatorState -import org.readium.navigator.web.preferences.NavigatorPreferences +import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorPreferences import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl import org.readium.r2.shared.util.DebugError @@ -50,7 +50,7 @@ class DemoViewModel( data class Reader( val navigatorState: PrepaginatedWebNavigatorState, - val preferencesViewModel: UserPreferencesViewModel + val preferencesViewModel: UserPreferencesViewModel ) : State } @@ -100,7 +100,7 @@ class DemoViewModel( return@launch } - val initialPreferences = NavigatorPreferences() + val initialPreferences = PrepaginatedWebNavigatorPreferences() val preferencesViewModel = UserPreferencesViewModel( diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferences.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferences.kt index 7c931d6d3d..cfbc1e8942 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferences.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferences.kt @@ -26,7 +26,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import org.readium.navigator.web.preferences.NavigatorPreferencesEditor +import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorPreferencesEditor import org.readium.r2.navigator.preferences.Configurable import org.readium.r2.navigator.preferences.EnumPreference import org.readium.r2.navigator.preferences.Fit @@ -90,7 +90,7 @@ private fun

    , E : PreferencesEditor

    > UserPref Divider() when (editor) { - is NavigatorPreferencesEditor -> + is PrepaginatedWebNavigatorPreferencesEditor -> FixedLayoutUserPreferences( commit = commit, readingProgression = editor.readingProgression, diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt index 307580f976..71e940cc4f 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt @@ -7,9 +7,9 @@ package org.readium.navigator.web import android.app.Application -import org.readium.navigator.web.preferences.NavigatorDefaults -import org.readium.navigator.web.preferences.NavigatorPreferences -import org.readium.navigator.web.preferences.NavigatorPreferencesEditor +import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorDefaults +import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorPreferences +import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorPreferencesEditor import org.readium.navigator.web.util.WebViewServer import org.readium.navigator.web.webapi.PrepaginatedDoubleApi import org.readium.navigator.web.webapi.PrepaginatedSingleApi @@ -28,7 +28,7 @@ import org.readium.r2.shared.util.Try public class PrepaginatedWebNavigatorFactory private constructor( private val application: Application, private val publication: Publication, - private val defaults: NavigatorDefaults + private val defaults: PrepaginatedWebNavigatorDefaults ) { public companion object { @@ -45,7 +45,11 @@ public class PrepaginatedWebNavigatorFactory private constructor( return null } - return PrepaginatedWebNavigatorFactory(application, publication, NavigatorDefaults()) + return PrepaginatedWebNavigatorFactory( + application, + publication, + PrepaginatedWebNavigatorDefaults() + ) } } @@ -61,7 +65,7 @@ public class PrepaginatedWebNavigatorFactory private constructor( public suspend fun createNavigator( initialLocator: Locator? = null, - initialPreferences: NavigatorPreferences? = null, + initialPreferences: PrepaginatedWebNavigatorPreferences? = null, readingOrder: List = publication.readingOrder ): Try { val items = readingOrder.map { @@ -99,7 +103,7 @@ public class PrepaginatedWebNavigatorFactory private constructor( PrepaginatedWebNavigatorState( publicationMetadata = publication.metadata, readingOrder = PrepaginatedWebNavigatorState.ReadingOrder(items), - initialPreferences = initialPreferences ?: NavigatorPreferences(), + initialPreferences = initialPreferences ?: PrepaginatedWebNavigatorPreferences(), defaults = defaults, initialItem = initialIndex, webViewServer = webViewServer, @@ -113,9 +117,9 @@ public class PrepaginatedWebNavigatorFactory private constructor( } public fun createPreferencesEditor( - currentPreferences: NavigatorPreferences - ): NavigatorPreferencesEditor = - NavigatorPreferencesEditor( + currentPreferences: PrepaginatedWebNavigatorPreferences + ): PrepaginatedWebNavigatorPreferencesEditor = + PrepaginatedWebNavigatorPreferencesEditor( currentPreferences, publication.metadata, defaults diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt index 549cb40276..f4862a25f1 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt @@ -8,10 +8,10 @@ import androidx.compose.runtime.mutableStateOf import org.readium.navigator.web.layout.LayoutResolver import org.readium.navigator.web.layout.Page import org.readium.navigator.web.layout.Spread -import org.readium.navigator.web.preferences.NavigatorDefaults -import org.readium.navigator.web.preferences.NavigatorPreferences -import org.readium.navigator.web.preferences.NavigatorSettings -import org.readium.navigator.web.preferences.NavigatorSettingsResolver +import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorDefaults +import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorPreferences +import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorSettings +import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorSettingsResolver import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.util.WebViewServer import org.readium.r2.navigator.preferences.Fit @@ -26,8 +26,8 @@ import org.readium.r2.shared.util.Url public class PrepaginatedWebNavigatorState internal constructor( publicationMetadata: Metadata, readingOrder: ReadingOrder, - initialPreferences: NavigatorPreferences, - defaults: NavigatorDefaults, + initialPreferences: PrepaginatedWebNavigatorPreferences, + defaults: PrepaginatedWebNavigatorDefaults, initialItem: Int, internal val webViewServer: WebViewServer, internal val preloadedData: PreloadedData @@ -52,15 +52,15 @@ public class PrepaginatedWebNavigatorState internal constructor( ) private val settingsResolver = - NavigatorSettingsResolver(publicationMetadata, defaults) + PrepaginatedWebNavigatorSettingsResolver(publicationMetadata, defaults) private val layoutResolver = LayoutResolver(readingOrder.items.map { Page(it.href, it.page) }) - public val preferences: MutableState = + public val preferences: MutableState = mutableStateOf(initialPreferences) - public val settings: State = + public val settings: State = derivedStateOf { settingsResolver.settings(preferences.value) } internal val webViewClient = diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt index 9848acc46c..7132787d36 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt @@ -1,6 +1,6 @@ package org.readium.navigator.web.layout -import org.readium.navigator.web.preferences.NavigatorSettings +import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorSettings import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.presentation.Presentation @@ -10,7 +10,7 @@ internal class LayoutResolver( private val readingOrder: List ) { - fun layout(settings: NavigatorSettings): List = + fun layout(settings: PrepaginatedWebNavigatorSettings): List = if (settings.spreads) { when (settings.readingProgression) { ReadingProgression.LTR -> layoutSpreadsLtr() diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorDefaults.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorDefaults.kt similarity index 87% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorDefaults.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorDefaults.kt index 91adbdec32..b84cf8c24c 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorDefaults.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorDefaults.kt @@ -5,7 +5,7 @@ import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi @ExperimentalReadiumApi -public data class NavigatorDefaults( +public data class PrepaginatedWebNavigatorDefaults( val fit: Fit? = Fit.CONTAIN, val readingProgression: ReadingProgression? = null, val spreads: Boolean? = false diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferences.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferences.kt similarity index 72% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferences.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferences.kt index f5ca1d575d..228ec8e1af 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferences.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferences.kt @@ -8,18 +8,18 @@ import org.readium.r2.shared.ExperimentalReadiumApi @Serializable @ExperimentalReadiumApi -public data class NavigatorPreferences( +public data class PrepaginatedWebNavigatorPreferences( val fit: Fit? = null, val readingProgression: ReadingProgression? = null, val spreads: Boolean? = null -) : Configurable.Preferences { +) : Configurable.Preferences { init { require(fit in listOf(null, Fit.CONTAIN, Fit.WIDTH, Fit.HEIGHT)) } - override operator fun plus(other: NavigatorPreferences): NavigatorPreferences = - NavigatorPreferences( + override operator fun plus(other: PrepaginatedWebNavigatorPreferences): PrepaginatedWebNavigatorPreferences = + PrepaginatedWebNavigatorPreferences( fit = other.fit ?: fit, readingProgression = other.readingProgression ?: readingProgression, spreads = other.spreads ?: spreads diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesEditor.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferencesEditor.kt similarity index 72% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesEditor.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferencesEditor.kt index c0d2d9684f..482c4c1c16 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesEditor.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferencesEditor.kt @@ -18,36 +18,36 @@ import org.readium.r2.shared.InternalReadiumApi import org.readium.r2.shared.publication.Metadata /** - * Interactive editor of [NavigatorPreferences]. + * Interactive editor of [PrepaginatedWebNavigatorPreferences]. * * This can be used as a view model for a user preferences screen. * - * @see NavigatorPreferences + * @see PrepaginatedWebNavigatorPreferences */ @ExperimentalReadiumApi @OptIn(InternalReadiumApi::class) -public class NavigatorPreferencesEditor internal constructor( - initialPreferences: NavigatorPreferences, +public class PrepaginatedWebNavigatorPreferencesEditor internal constructor( + initialPreferences: PrepaginatedWebNavigatorPreferences, publicationMetadata: Metadata, - defaults: NavigatorDefaults -) : PreferencesEditor { + defaults: PrepaginatedWebNavigatorDefaults +) : PreferencesEditor { private data class State( - val preferences: NavigatorPreferences, - val settings: NavigatorSettings + val preferences: PrepaginatedWebNavigatorPreferences, + val settings: PrepaginatedWebNavigatorSettings ) - private val settingsResolver: NavigatorSettingsResolver = - NavigatorSettingsResolver(publicationMetadata, defaults) + private val settingsResolver: PrepaginatedWebNavigatorSettingsResolver = + PrepaginatedWebNavigatorSettingsResolver(publicationMetadata, defaults) private var state: State = initialPreferences.toState() - override val preferences: NavigatorPreferences + override val preferences: PrepaginatedWebNavigatorPreferences get() = state.preferences override fun clear() { - updateValues { NavigatorPreferences() } + updateValues { PrepaginatedWebNavigatorPreferences() } } public val fit: EnumPreference = @@ -76,11 +76,13 @@ public class NavigatorPreferencesEditor internal constructor( updateValue = { value -> updateValues { it.copy(spreads = value) } } ) - private fun updateValues(updater: (NavigatorPreferences) -> NavigatorPreferences) { + private fun updateValues( + updater: (PrepaginatedWebNavigatorPreferences) -> PrepaginatedWebNavigatorPreferences + ) { val newPreferences = updater(preferences) state = newPreferences.toState() } - private fun NavigatorPreferences.toState() = + private fun PrepaginatedWebNavigatorPreferences.toState() = State(preferences = this, settings = settingsResolver.settings(this)) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesFilters.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferencesFilters.kt similarity index 56% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesFilters.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferencesFilters.kt index 158300933a..7c2af843e3 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorPreferencesFilters.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferencesFilters.kt @@ -10,25 +10,25 @@ import org.readium.r2.navigator.preferences.PreferencesFilter import org.readium.r2.shared.ExperimentalReadiumApi /** - * Suggested filter to keep only shared [NavigatorPreferences]. + * Suggested filter to keep only shared [PrepaginatedWebNavigatorPreferences]. */ @ExperimentalReadiumApi -public object NavigatorSharedPreferencesFilter : PreferencesFilter { +public object NavigatorSharedPreferencesFilter : PreferencesFilter { - override fun filter(preferences: NavigatorPreferences): NavigatorPreferences = + override fun filter(preferences: PrepaginatedWebNavigatorPreferences): PrepaginatedWebNavigatorPreferences = preferences.copy( readingProgression = null ) } /** - * Suggested filter to keep only publication-specific [NavigatorPreferences]. + * Suggested filter to keep only publication-specific [PrepaginatedWebNavigatorPreferences]. */ @ExperimentalReadiumApi -public object NavigatorPublicationPreferencesFilter : PreferencesFilter { +public object NavigatorPublicationPreferencesFilter : PreferencesFilter { - override fun filter(preferences: NavigatorPreferences): NavigatorPreferences = - NavigatorPreferences( + override fun filter(preferences: PrepaginatedWebNavigatorPreferences): PrepaginatedWebNavigatorPreferences = + PrepaginatedWebNavigatorPreferences( readingProgression = preferences.readingProgression ) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettings.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorSettings.kt similarity index 88% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettings.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorSettings.kt index 40c0b80e58..1ca209a900 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettings.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorSettings.kt @@ -6,7 +6,7 @@ import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi @ExperimentalReadiumApi -public data class NavigatorSettings( +public data class PrepaginatedWebNavigatorSettings( val fit: Fit, val readingProgression: ReadingProgression, val spreads: Boolean diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettingsResolver.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorSettingsResolver.kt similarity index 80% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettingsResolver.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorSettingsResolver.kt index dbeb956890..8d4708eb83 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/NavigatorSettingsResolver.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorSettingsResolver.kt @@ -7,12 +7,12 @@ import org.readium.r2.shared.publication.Metadata import org.readium.r2.shared.publication.ReadingProgression as PublicationReadingProgression @ExperimentalReadiumApi -internal class NavigatorSettingsResolver( +internal class PrepaginatedWebNavigatorSettingsResolver( private val metadata: Metadata, - private val defaults: NavigatorDefaults + private val defaults: PrepaginatedWebNavigatorDefaults ) { - fun settings(preferences: NavigatorPreferences): NavigatorSettings { + fun settings(preferences: PrepaginatedWebNavigatorPreferences): PrepaginatedWebNavigatorSettings { val readingProgression: ReadingProgression = preferences.readingProgression ?: when (metadata.readingProgression) { @@ -26,7 +26,7 @@ internal class NavigatorSettingsResolver( val spreads = preferences.spreads ?: defaults.spreads ?: false - return NavigatorSettings( + return PrepaginatedWebNavigatorSettings( fit = fit, readingProgression = readingProgression, spreads = spreads From 4fe9aa72c4ea1f502082b17917611973207c5092 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Mon, 16 Sep 2024 18:31:21 +0200 Subject: [PATCH 23/61] Don't perform fling on both pager and WebView --- .../readium/navigator/demo/DemoActivity.kt | 8 ++- .../dist/prepaginated-double-index.html | 2 + .../dist/prepaginated-double-script.js | 2 +- .../dist/prepaginated-double-script.js.map | 2 +- .../dist/prepaginated-single-index.html | 2 + .../dist/prepaginated-single-script.js | 2 +- .../dist/prepaginated-single-script.js.map | 2 +- .../public/prepaginated-double-index.html | 2 + .../public/prepaginated-single-index.html | 2 + .../scripts/src/index-prepaginated-double.ts | 2 +- .../scripts/src/index-prepaginated-single.ts | 2 +- .../web/prepaginated-double-index.html | 2 + .../web/prepaginated-double-script.js | 2 +- .../web/prepaginated-double-script.js.map | 2 +- .../web/prepaginated-single-index.html | 2 + .../web/prepaginated-single-script.js | 2 +- .../web/prepaginated-single-script.js.map | 2 +- .../navigator/web/pager/NavigatorPager.kt | 3 +- ...tion.kt => PagerNestedScrollConnection.kt} | 26 +++++++++- .../navigator/web/spread/DoubleSpread.kt | 2 +- .../navigator/web/spread/SingleSpread.kt | 2 +- .../spread/SpreadNestedScrollConnection.kt | 49 +++++++++++++++++++ .../navigator/web/spread/SpreadWebView.kt | 13 ++++- .../web/webview/ComposableWebView.kt | 11 +++-- .../web/webview/WebViewScrollable2DState.kt | 1 + 25 files changed, 124 insertions(+), 23 deletions(-) rename readium/navigators/web/src/main/java/org/readium/navigator/web/pager/{PagerNestedConnection.kt => PagerNestedScrollConnection.kt} (80%) create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadNestedScrollConnection.kt diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt index 64ad1e46fd..d1fd6a43d0 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt @@ -15,6 +15,7 @@ import androidx.activity.viewModels import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawingPadding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Settings import androidx.compose.material3.CenterAlignedTopAppBar @@ -63,7 +64,9 @@ class DemoActivity : ComponentActivity() { var showPreferences by remember { mutableStateOf(false) } Scaffold( - modifier = Modifier.fillMaxSize(), + modifier = Modifier + .safeDrawingPadding() + .fillMaxSize(), topBar = { TopBar( onPreferencesActivated = { @@ -109,7 +112,8 @@ class DemoActivity : ComponentActivity() { } PrepaginatedWebNavigator( - modifier = Modifier.fillMaxSize(), + modifier = Modifier + .fillMaxSize(), state = stateNow.navigatorState ) } diff --git a/readium/navigators/web/scripts/dist/prepaginated-double-index.html b/readium/navigators/web/scripts/dist/prepaginated-double-index.html index b6c044dbd9..b97f7653fb 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-double-index.html +++ b/readium/navigators/web/scripts/dist/prepaginated-double-index.html @@ -5,6 +5,8 @@ * { margin: 0; padding: 0; + border: none; + border-spacing: 0; } body, html { diff --git a/readium/navigators/web/scripts/dist/prepaginated-double-script.js b/readium/navigators/web/scripts/dist/prepaginated-double-script.js index 7a46abfeb1..9f51a30209 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-double-script.js +++ b/readium/navigators/web/scripts/dist/prepaginated-double-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),a=parseFloat(e.get("height"));return h&&a?{width:h,height:a}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const e={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(e),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:h},r=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,a,this.viewport);this.metaViewport.content=(new i).setInitialScale(r).setMinimumScale(r).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),a=new e(i,s,h);t.loadSpread=function(t){a.loadSpread(t)},t.setViewport=function(t,i,e,s,h,r){const n={width:t,height:i},o={top:e,left:s,bottom:h,right:r};a.setViewport(n,o)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);a.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),a=parseFloat(e.get("height"));return h&&a?{width:h,height:a}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const e={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(e),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:h},n=function(t,i,e){switch(t){case"contain":return function(t,i){console.log(`contentWidth ${t.width} containerWidth ${i.width}`);const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,a,this.viewport);this.metaViewport.content=(new i).setInitialScale(n).setMinimumScale(n).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),a=new e(i,s,h);t.loadSpread=function(t){a.loadSpread(t)},t.setViewport=function(t,i,e,s,h,n){const r={width:t,height:i},o={top:e,left:s,bottom:h,right:n};a.setViewport(r,o)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);a.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); //# sourceMappingURL=prepaginated-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map index 6638c72687..1a978aef4e 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map +++ b/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n console.log(`contentWidth ${content.width} containerWidth ${container.width}`);\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","console","log","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-single-index.html b/readium/navigators/web/scripts/dist/prepaginated-single-index.html index d72e5eb9a2..dfae3d6ce2 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-single-index.html +++ b/readium/navigators/web/scripts/dist/prepaginated-single-index.html @@ -5,6 +5,8 @@ * { margin: 0; padding: 0; + border: none; + border-spacing: 0; } body, html { diff --git a/readium/navigators/web/scripts/dist/prepaginated-single-script.js b/readium/navigators/web/scripts/dist/prepaginated-single-script.js index 5830f23a2d..e2000f9155 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-single-script.js +++ b/readium/navigators/web/scripts/dist/prepaginated-single-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){console.log(`contentWidth ${t.width} containerWidth ${i.width}`);const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); //# sourceMappingURL=prepaginated-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map index 30ad060820..849a7648f8 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map +++ b/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n console.log(`contentWidth ${content.width} containerWidth ${container.width}`);\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","console","log","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/public/prepaginated-double-index.html b/readium/navigators/web/scripts/public/prepaginated-double-index.html index b6c044dbd9..b97f7653fb 100644 --- a/readium/navigators/web/scripts/public/prepaginated-double-index.html +++ b/readium/navigators/web/scripts/public/prepaginated-double-index.html @@ -5,6 +5,8 @@ * { margin: 0; padding: 0; + border: none; + border-spacing: 0; } body, html { diff --git a/readium/navigators/web/scripts/public/prepaginated-single-index.html b/readium/navigators/web/scripts/public/prepaginated-single-index.html index d72e5eb9a2..dfae3d6ce2 100644 --- a/readium/navigators/web/scripts/public/prepaginated-single-index.html +++ b/readium/navigators/web/scripts/public/prepaginated-single-index.html @@ -5,6 +5,8 @@ * { margin: 0; padding: 0; + border: none; + border-spacing: 0; } body, html { diff --git a/readium/navigators/web/scripts/src/index-prepaginated-double.ts b/readium/navigators/web/scripts/src/index-prepaginated-double.ts index 8ebb13290d..1b84559e67 100644 --- a/readium/navigators/web/scripts/src/index-prepaginated-double.ts +++ b/readium/navigators/web/scripts/src/index-prepaginated-double.ts @@ -32,7 +32,7 @@ namespace Layout { insetBottom: number, insetRight: number ) { - const viewport: Size = { width: viewporttWidth, height: viewportHeight } + const viewport: Size = { width: viewporttWidth, height: viewportHeight} const insets: Insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight } manager.setViewport(viewport, insets) } diff --git a/readium/navigators/web/scripts/src/index-prepaginated-single.ts b/readium/navigators/web/scripts/src/index-prepaginated-single.ts index 53a2e2ed72..1b77749aab 100644 --- a/readium/navigators/web/scripts/src/index-prepaginated-single.ts +++ b/readium/navigators/web/scripts/src/index-prepaginated-single.ts @@ -47,7 +47,7 @@ namespace Layout { insetRight: number ) { - const viewport: Size = { width: viewporttWidth, height: viewportHeight }; + const viewport: Size = { width: viewporttWidth, height: viewportHeight}; const insets: Insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight }; manager.setViewport(viewport, insets); } diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-index.html b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-index.html index b6c044dbd9..b97f7653fb 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-index.html +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-index.html @@ -5,6 +5,8 @@ * { margin: 0; padding: 0; + border: none; + border-spacing: 0; } body, html { diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js index 7a46abfeb1..9f51a30209 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),a=parseFloat(e.get("height"));return h&&a?{width:h,height:a}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const e={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(e),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:h},r=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,a,this.viewport);this.metaViewport.content=(new i).setInitialScale(r).setMinimumScale(r).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),a=new e(i,s,h);t.loadSpread=function(t){a.loadSpread(t)},t.setViewport=function(t,i,e,s,h,r){const n={width:t,height:i},o={top:e,left:s,bottom:h,right:r};a.setViewport(n,o)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);a.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),a=parseFloat(e.get("height"));return h&&a?{width:h,height:a}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const e={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(e),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:h},n=function(t,i,e){switch(t){case"contain":return function(t,i){console.log(`contentWidth ${t.width} containerWidth ${i.width}`);const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,a,this.viewport);this.metaViewport.content=(new i).setInitialScale(n).setMinimumScale(n).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),a=new e(i,s,h);t.loadSpread=function(t){a.loadSpread(t)},t.setViewport=function(t,i,e,s,h,n){const r={width:t,height:i},o={top:e,left:s,bottom:h,right:n};a.setViewport(r,o)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);a.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); //# sourceMappingURL=prepaginated-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map index 6638c72687..1a978aef4e 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n console.log(`contentWidth ${content.width} containerWidth ${container.width}`);\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","console","log","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-index.html b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-index.html index d72e5eb9a2..dfae3d6ce2 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-index.html +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-index.html @@ -5,6 +5,8 @@ * { margin: 0; padding: 0; + border: none; + border-spacing: 0; } body, html { diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js index 5830f23a2d..e2000f9155 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){console.log(`contentWidth ${t.width} containerWidth ${i.width}`);const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); //# sourceMappingURL=prepaginated-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map index 30ad060820..849a7648f8 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n console.log(`contentWidth ${content.width} containerWidth ${container.width}`);\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","console","log","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/NavigatorPager.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/NavigatorPager.kt index 939ef86151..7f6f259d21 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/NavigatorPager.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/NavigatorPager.kt @@ -30,7 +30,8 @@ internal fun NavigatorPager( beyondViewportPageCount = beyondViewportPageCount, reverseLayout = reverseLayout, flingBehavior = flingBehavior, - pageNestedScrollConnection = PagerNestedConnection( + pageNestedScrollConnection = + PagerNestedScrollConnection( state, flingBehavior, Orientation.Horizontal diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/PagerNestedConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/PagerNestedScrollConnection.kt similarity index 80% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/pager/PagerNestedConnection.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/pager/PagerNestedScrollConnection.kt index f8abd2870f..808aa141f6 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/PagerNestedConnection.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/PagerNestedScrollConnection.kt @@ -10,12 +10,14 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.unit.Velocity import kotlin.math.abs -internal class PagerNestedConnection( +internal class PagerNestedScrollConnection( private val state: PagerState, private val flingBehavior: TargetedFlingBehavior, private val orientation: Orientation ) : NestedScrollConnection { + private var spreadConsumedVertically = false + private val PagerState.firstVisibleOffset get() = layoutInfo.visiblePagesInfo.first().offset @@ -50,6 +52,16 @@ internal class PagerNestedConnection( } override suspend fun onPreFling(available: Velocity): Velocity { + if (state.layoutInfo.visiblePagesInfo.size > 1) { + state.scroll(scrollPriority = MutatePriority.Default) { + with(flingBehavior) { + performFling(-available.x) + } + } + + return available + } + return Velocity.Zero } @@ -58,6 +70,13 @@ internal class PagerNestedConnection( available: Offset, source: NestedScrollSource ): Offset { + if (abs(consumed.y) > 0) { + spreadConsumedVertically = true + } + + if (spreadConsumedVertically) { + return Offset.Zero + } val consumedX = -state.dispatchRawDelta(-available.x) return Offset(consumedX, 0f) } @@ -66,6 +85,11 @@ internal class PagerNestedConnection( consumed: Velocity, available: Velocity ): Velocity { + if (spreadConsumedVertically) { + spreadConsumedVertically = false + return Velocity.Zero + } + var remaining = available.x state.scroll(scrollPriority = MutatePriority.Default) { diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleSpread.kt index 2fd9c11961..39b20c5551 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleSpread.kt @@ -61,7 +61,7 @@ internal fun DoubleSpread( } } - PageWebView( + SpreadWebView( state = webViewState, client = state.webViewClient ) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleSpread.kt index 1b469ec3c8..8b2a4dfab0 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleSpread.kt @@ -61,7 +61,7 @@ internal fun SingleSpread( } } - PageWebView( + SpreadWebView( state = webViewState, client = state.webViewClient ) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadNestedScrollConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadNestedScrollConnection.kt new file mode 100644 index 0000000000..9ffd2eeb91 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadNestedScrollConnection.kt @@ -0,0 +1,49 @@ +package org.readium.navigator.web.spread + +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.input.nestedscroll.NestedScrollSource +import androidx.compose.ui.unit.Velocity +import kotlin.math.abs +import org.readium.navigator.web.webview.WebViewScrollable2DState + +internal class SpreadNestedScrollConnection( + private val webviewState: WebViewScrollable2DState +) : NestedScrollConnection { + + override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { + val webViewNow = webviewState.webView ?: return Offset.Zero + + val maxX = + webViewNow.horizontalScrollRange - webViewNow.horizontalScrollExtent + + val webViewCannotScrollHorizontally = + webViewNow.scrollX < 1 && available.x > 0 || (maxX - webViewNow.scrollX) < 1 && available.x < 0 + + val isGestureHorizontal = + (abs(available.y) / abs(available.x)) < 0.58 // tan(Pi/6) + + return if (webViewCannotScrollHorizontally && isGestureHorizontal) { + // If the gesture is mostly horizontal and the spread has nothing to consume horizontally, + // we consume everything vertically. + Offset(0f, available.y) + } else { + Offset.Zero + } + } + + override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { + val webViewNow = webviewState.webView ?: return Velocity.Zero + + val maxX = + webViewNow.horizontalScrollRange - webViewNow.horizontalScrollExtent + + if ((maxX - webViewNow.scrollX) < 15) { + webViewNow.scrollTo(maxX, webViewNow.scrollY) + } else if (webViewNow.scrollX in (0 until 15)) { + webViewNow.scrollTo(0, webViewNow.scrollY) + } + + return Velocity.Zero + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt index a8046aa31f..1149e8618c 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt @@ -3,22 +3,31 @@ package org.readium.navigator.web.spread import android.annotation.SuppressLint import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier +import androidx.compose.ui.input.nestedscroll.nestedScroll import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.webview.WebView +import org.readium.navigator.web.webview.WebViewScrollable2DState import org.readium.navigator.web.webview.WebViewState @SuppressLint("SetJavaScriptEnabled") @Composable -internal fun PageWebView( +internal fun SpreadWebView( state: WebViewState, client: WebViewClient ) { + val scrollableState = remember { WebViewScrollable2DState() } + + val spreadNestedScrollConnection = SpreadNestedScrollConnection(scrollableState) + WebView( modifier = Modifier - .fillMaxSize(), + .fillMaxSize() + .nestedScroll(spreadNestedScrollConnection), state = state, client = client, + scrollableState = scrollableState, onCreated = { webview -> webview.settings.javaScriptEnabled = true webview.settings.setSupportZoom(true) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt index 759f251530..9f6471ce62 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt @@ -60,6 +60,7 @@ import org.readium.navigator.web.webview.LoadingState.Loading internal fun WebView( state: WebViewState, modifier: Modifier = Modifier, + scrollableState: WebViewScrollable2DState = remember { WebViewScrollable2DState() }, flingBehavior: Fling2DBehavior? = null, onCreated: (WebView) -> Unit = {}, onDispose: (WebView) -> Unit = {}, @@ -101,6 +102,7 @@ internal fun WebView( item { WebView( state, + scrollableState, flingBehavior, layoutParams, Modifier.fillParentMaxSize(), @@ -139,6 +141,7 @@ internal fun WebView( @Composable internal fun WebView( state: WebViewState, + scrollableState: WebViewScrollable2DState, flingBehavior: Fling2DBehavior?, layoutParams: FrameLayout.LayoutParams, modifier: Modifier = Modifier, @@ -174,8 +177,6 @@ internal fun WebView( } } - val draggableState = remember { WebViewScrollable2DState() } - AndroidView( factory = { context -> (factory?.let { it(context) } ?: RelaxedWebView(context)).apply { @@ -190,14 +191,14 @@ internal fun WebView( webChromeClient = chromeClient webViewClient = client - draggableState.webView = this + scrollableState.webView = this }.also { state.webView = it } }, modifier = modifier - .scrollable2D(draggableState, flingBehavior = flingBehavior), + .scrollable2D(scrollableState, flingBehavior = flingBehavior), onRelease = { onDispose(it) - draggableState.webView = null + scrollableState.webView = null state.webView = null } ) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/WebViewScrollable2DState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/WebViewScrollable2DState.kt index 380efa9812..4d4e1ad69e 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/WebViewScrollable2DState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/WebViewScrollable2DState.kt @@ -43,6 +43,7 @@ private class WebViewDeltaDispatcher { val consumedX = (currentX - webViewNow.scrollX).toFloat().coerceAbsAtMost(abs(delta.x)) val consumedY = (currentY - webViewNow.scrollY).toFloat().coerceAbsAtMost(abs(delta.y)) val consumed = Offset(consumedX, consumedY) + return consumed } From 68652e572abf40a71fcca77d5e7afec80832bac7 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Tue, 17 Sep 2024 13:31:57 +0200 Subject: [PATCH 24/61] Cosmetic changes --- .../web/spread/SpreadNestedScrollConnection.kt | 13 ++++--------- .../readium/navigator/web/webview/RelaxedWebView.kt | 6 ++++++ .../web/webview/WebViewScrollable2DState.kt | 4 ++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadNestedScrollConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadNestedScrollConnection.kt index 9ffd2eeb91..a7bcf332c2 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadNestedScrollConnection.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadNestedScrollConnection.kt @@ -14,11 +14,9 @@ internal class SpreadNestedScrollConnection( override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { val webViewNow = webviewState.webView ?: return Offset.Zero - val maxX = - webViewNow.horizontalScrollRange - webViewNow.horizontalScrollExtent - val webViewCannotScrollHorizontally = - webViewNow.scrollX < 1 && available.x > 0 || (maxX - webViewNow.scrollX) < 1 && available.x < 0 + (webViewNow.scrollX < 1 && available.x > 0) || + ((webViewNow.maxScrollX - webViewNow.scrollX) < 1 && available.x < 0) val isGestureHorizontal = (abs(available.y) / abs(available.x)) < 0.58 // tan(Pi/6) @@ -35,11 +33,8 @@ internal class SpreadNestedScrollConnection( override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { val webViewNow = webviewState.webView ?: return Velocity.Zero - val maxX = - webViewNow.horizontalScrollRange - webViewNow.horizontalScrollExtent - - if ((maxX - webViewNow.scrollX) < 15) { - webViewNow.scrollTo(maxX, webViewNow.scrollY) + if ((webViewNow.maxScrollX - webViewNow.scrollX) < 15) { + webViewNow.scrollTo(webViewNow.maxScrollX, webViewNow.scrollY) } else if (webViewNow.scrollX in (0 until 15)) { webViewNow.scrollTo(0, webViewNow.scrollY) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/RelaxedWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/RelaxedWebView.kt index f5a78f8ee4..ce6b900bf3 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/RelaxedWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/RelaxedWebView.kt @@ -5,6 +5,12 @@ import android.webkit.WebView internal class RelaxedWebView(context: Context) : WebView(context) { + val maxScrollX: Int get() = + horizontalScrollRange - horizontalScrollExtent + + val maxScrollY: Int get() = + verticalScrollRange - verticalScrollExtent + val verticalScrollRange: Int get() = computeVerticalScrollRange() diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/WebViewScrollable2DState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/WebViewScrollable2DState.kt index 4d4e1ad69e..1ba506941a 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/WebViewScrollable2DState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/WebViewScrollable2DState.kt @@ -30,8 +30,8 @@ private class WebViewDeltaDispatcher { val currentX = webViewNow.scrollX val currentY = webViewNow.scrollY - val maxX = webViewNow.horizontalScrollRange - webViewNow.horizontalScrollExtent - val maxY = webViewNow.verticalScrollRange - webViewNow.verticalScrollExtent + val maxX = webViewNow.maxScrollX + val maxY = webViewNow.maxScrollY // Consume slightly more than delta si we have to because // we don't want the pager to consume any rounding error From 4d3a97d9a55c654fa12c063684af2a3fb6442f68 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Tue, 17 Sep 2024 13:46:56 +0200 Subject: [PATCH 25/61] Lint --- .../src/main/java/org/readium/navigator/web/util/HtmlInjector.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/HtmlInjector.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/HtmlInjector.kt index 84e253d717..5592c662c1 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/HtmlInjector.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/HtmlInjector.kt @@ -23,6 +23,7 @@ import timber.log.Timber * @param baseHref Base URL where and scripts are served. */ @OptIn(ExperimentalReadiumApi::class) +@Suppress("UNUSED_PARAMETER") internal fun Resource.injectHtml( publication: Publication, mediaType: MediaType, From 92a022d181fa249b8ce620508753fb3d985c2636 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Tue, 17 Sep 2024 13:50:25 +0200 Subject: [PATCH 26/61] Remove Bella --- .../navigators/web/scripts/OEBPS/ANewDay.png | Bin 13817 -> 0 bytes .../web/scripts/OEBPS/BellaTheDragonAFF.jpg | Bin 44068 -> 0 bytes .../web/scripts/OEBPS/BellaTheDragonRA.png | Bin 68335 -> 0 bytes .../web/scripts/OEBPS/BellaYODAFF.jpg | Bin 51100 -> 0 bytes .../web/scripts/OEBPS/BellaYODPrintCover.jpg | Bin 38283 -> 0 bytes .../web/scripts/OEBPS/BellaYODRA.png | Bin 84513 -> 0 bytes .../web/scripts/OEBPS/ILoveToDoodle.jpg | Bin 51471 -> 0 bytes .../web/scripts/OEBPS/ILoveToDoodle.png | Bin 48973 -> 0 bytes .../navigators/web/scripts/OEBPS/LearnSVG.png | Bin 28264 -> 0 bytes .../web/scripts/OEBPS/LookAround.jpg | Bin 32945 -> 0 bytes .../web/scripts/OEBPS/WatchMeGrow.png | Bin 60550 -> 0 bytes .../navigators/web/scripts/OEBPS/bella0.xhtml | 1 - .../navigators/web/scripts/OEBPS/bella1.xhtml | 1 - .../web/scripts/OEBPS/bella10.xhtml | 1 - .../web/scripts/OEBPS/bella11.xhtml | 1 - .../web/scripts/OEBPS/bella12.xhtml | 1 - .../web/scripts/OEBPS/bella13.xhtml | 1 - .../web/scripts/OEBPS/bella14.xhtml | 1 - .../web/scripts/OEBPS/bella15.xhtml | 1 - .../web/scripts/OEBPS/bella16.xhtml | 1 - .../web/scripts/OEBPS/bella17.xhtml | 1 - .../web/scripts/OEBPS/bella18.xhtml | 1 - .../web/scripts/OEBPS/bella19.xhtml | 1 - .../navigators/web/scripts/OEBPS/bella2.xhtml | 1 - .../web/scripts/OEBPS/bella20.xhtml | 1 - .../web/scripts/OEBPS/bella21.xhtml | 1 - .../web/scripts/OEBPS/bella22.xhtml | 1 - .../navigators/web/scripts/OEBPS/bella3.xhtml | 1 - .../navigators/web/scripts/OEBPS/bella4.xhtml | 1 - .../navigators/web/scripts/OEBPS/bella5.xhtml | 1 - .../navigators/web/scripts/OEBPS/bella6.xhtml | 1 - .../navigators/web/scripts/OEBPS/bella7.xhtml | 1 - .../navigators/web/scripts/OEBPS/bella8.xhtml | 1 - .../navigators/web/scripts/OEBPS/bella9.xhtml | 1 - readium/navigators/web/scripts/OEBPS/bm.png | Bin 20753 -> 0 bytes .../navigators/web/scripts/OEBPS/books.xhtml | 1 - .../navigators/web/scripts/OEBPS/books2.xhtml | 1 - .../navigators/web/scripts/OEBPS/books3.xhtml | 1 - .../navigators/web/scripts/OEBPS/books4.xhtml | 1 - .../navigators/web/scripts/OEBPS/content.opf | 1 - .../navigators/web/scripts/OEBPS/cover.jpg | Bin 163191 -> 0 bytes .../navigators/web/scripts/OEBPS/cover.xhtml | 25 --- .../navigators/web/scripts/OEBPS/info.xhtml | 1 - .../navigators/web/scripts/OEBPS/jewels.jpg | Bin 66151 -> 0 bytes readium/navigators/web/scripts/OEBPS/ll.png | Bin 56578 -> 0 bytes .../navigators/web/scripts/OEBPS/logotail.jpg | Bin 23756 -> 0 bytes readium/navigators/web/scripts/OEBPS/lr.png | Bin 56351 -> 0 bytes .../navigators/web/scripts/OEBPS/page01.jpg | Bin 51021 -> 0 bytes .../navigators/web/scripts/OEBPS/page02.jpg | Bin 67137 -> 0 bytes .../navigators/web/scripts/OEBPS/page03.jpg | Bin 91966 -> 0 bytes .../navigators/web/scripts/OEBPS/page04.jpg | Bin 85318 -> 0 bytes .../navigators/web/scripts/OEBPS/page05.jpg | Bin 83721 -> 0 bytes .../navigators/web/scripts/OEBPS/page07.jpg | Bin 68602 -> 0 bytes .../navigators/web/scripts/OEBPS/page08.jpg | Bin 67539 -> 0 bytes .../navigators/web/scripts/OEBPS/page09.jpg | Bin 55182 -> 0 bytes .../navigators/web/scripts/OEBPS/page10.jpg | Bin 78660 -> 0 bytes .../navigators/web/scripts/OEBPS/page11.jpg | Bin 67998 -> 0 bytes .../navigators/web/scripts/OEBPS/page12.jpg | Bin 51760 -> 0 bytes .../navigators/web/scripts/OEBPS/page13.jpg | Bin 52612 -> 0 bytes .../navigators/web/scripts/OEBPS/page14.jpg | Bin 68811 -> 0 bytes .../navigators/web/scripts/OEBPS/page15-1.jpg | Bin 12946 -> 0 bytes .../navigators/web/scripts/OEBPS/page15-2.jpg | Bin 11508 -> 0 bytes .../navigators/web/scripts/OEBPS/page15-3.jpg | Bin 10181 -> 0 bytes .../navigators/web/scripts/OEBPS/page16.jpg | Bin 73418 -> 0 bytes .../navigators/web/scripts/OEBPS/page17.jpg | Bin 74288 -> 0 bytes .../navigators/web/scripts/OEBPS/page18.jpg | Bin 55753 -> 0 bytes .../navigators/web/scripts/OEBPS/page19.jpg | Bin 62242 -> 0 bytes .../navigators/web/scripts/OEBPS/page20.jpg | Bin 36500 -> 0 bytes .../navigators/web/scripts/OEBPS/page22.jpg | Bin 64159 -> 0 bytes .../navigators/web/scripts/OEBPS/styles.css | 185 ------------------ .../navigators/web/scripts/OEBPS/toc.xhtml | 1 - readium/navigators/web/scripts/OEBPS/ul.png | Bin 56405 -> 0 bytes readium/navigators/web/scripts/OEBPS/um.png | Bin 20246 -> 0 bytes readium/navigators/web/scripts/OEBPS/ur.png | Bin 56327 -> 0 bytes 74 files changed, 240 deletions(-) delete mode 100644 readium/navigators/web/scripts/OEBPS/ANewDay.png delete mode 100644 readium/navigators/web/scripts/OEBPS/BellaTheDragonAFF.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/BellaTheDragonRA.png delete mode 100644 readium/navigators/web/scripts/OEBPS/BellaYODAFF.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/BellaYODPrintCover.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/BellaYODRA.png delete mode 100644 readium/navigators/web/scripts/OEBPS/ILoveToDoodle.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/ILoveToDoodle.png delete mode 100644 readium/navigators/web/scripts/OEBPS/LearnSVG.png delete mode 100644 readium/navigators/web/scripts/OEBPS/LookAround.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/WatchMeGrow.png delete mode 100644 readium/navigators/web/scripts/OEBPS/bella0.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella1.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella10.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella11.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella12.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella13.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella14.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella15.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella16.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella17.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella18.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella19.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella2.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella20.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella21.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella22.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella3.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella4.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella5.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella6.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella7.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella8.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bella9.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/bm.png delete mode 100644 readium/navigators/web/scripts/OEBPS/books.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/books2.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/books3.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/books4.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/content.opf delete mode 100644 readium/navigators/web/scripts/OEBPS/cover.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/cover.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/info.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/jewels.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/ll.png delete mode 100644 readium/navigators/web/scripts/OEBPS/logotail.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/lr.png delete mode 100644 readium/navigators/web/scripts/OEBPS/page01.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page02.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page03.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page04.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page05.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page07.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page08.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page09.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page10.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page11.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page12.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page13.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page14.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page15-1.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page15-2.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page15-3.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page16.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page17.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page18.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page19.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page20.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/page22.jpg delete mode 100644 readium/navigators/web/scripts/OEBPS/styles.css delete mode 100644 readium/navigators/web/scripts/OEBPS/toc.xhtml delete mode 100644 readium/navigators/web/scripts/OEBPS/ul.png delete mode 100644 readium/navigators/web/scripts/OEBPS/um.png delete mode 100644 readium/navigators/web/scripts/OEBPS/ur.png diff --git a/readium/navigators/web/scripts/OEBPS/ANewDay.png b/readium/navigators/web/scripts/OEBPS/ANewDay.png deleted file mode 100644 index c7a70ac1febf85fbb5a57819633180decd165b32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13817 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 F@_z`5CXoOD diff --git a/readium/navigators/web/scripts/OEBPS/BellaTheDragonAFF.jpg b/readium/navigators/web/scripts/OEBPS/BellaTheDragonAFF.jpg deleted file mode 100644 index 1ce474c20f7e5960c78838a16948ea98a354ce5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44068 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 diff --git a/readium/navigators/web/scripts/OEBPS/BellaYODPrintCover.jpg b/readium/navigators/web/scripts/OEBPS/BellaYODPrintCover.jpg deleted file mode 100644 index cd863b48dd2404860b994bc2cb11cdf15da44cc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38283 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 diff --git a/readium/navigators/web/scripts/OEBPS/BellaYODRA.png b/readium/navigators/web/scripts/OEBPS/BellaYODRA.png deleted file mode 100644 index 910c4dfe6ee0425cc09a9f03aa63b651cb76689d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84513 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 w7HbYgFz>%07*qoM6N<$f)gD~J^%m! diff --git a/readium/navigators/web/scripts/OEBPS/ILoveToDoodle.jpg b/readium/navigators/web/scripts/OEBPS/ILoveToDoodle.jpg deleted file mode 100644 index d18f27ca98e442e687adaf726f91e0d817c6c9a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51471 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 Qr(y4bE#X74S7NXK*%{a%3jhEB diff --git a/readium/navigators/web/scripts/OEBPS/ILoveToDoodle.png b/readium/navigators/web/scripts/OEBPS/ILoveToDoodle.png deleted file mode 100644 index a18f5c2cd7f6fdaa6f8ca18e41990f80e18b52e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48973 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 z 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 JPDHLkV1i2Gv}6DP diff --git a/readium/navigators/web/scripts/OEBPS/LearnSVG.png b/readium/navigators/web/scripts/OEBPS/LearnSVG.png deleted file mode 100644 index 00cbbafda897bcf5890f186fe9e1bf2105d33ac2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28264 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 diff --git a/readium/navigators/web/scripts/OEBPS/LookAround.jpg b/readium/navigators/web/scripts/OEBPS/LookAround.jpg deleted file mode 100644 index 4291ce56f3c7e32bce9d97d7d7facd4035157bbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32945 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 Bella The Dragon - Original Edition

    Upper left Corner Image
    Lower Left Corner Image
    Upper Right Corner Image
    Lower Right Corner Image
    Middle Left Image
    Middle Right Image
    Story Picture
    Bella The Dragon
    written by
    Barbara Nick
    illustrated by
    Elaine Steckler
    Copyright © Catto Creations, 2000-2013. All rights reserved.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella1.xhtml b/readium/navigators/web/scripts/OEBPS/bella1.xhtml deleted file mode 100644 index 1b203051f2..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella1.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    Once in a land not so far away ...
    and
    a time not so long ago ...
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella10.xhtml b/readium/navigators/web/scripts/OEBPS/bella10.xhtml deleted file mode 100644 index 46c4b24108..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella10.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    Bella, weak and weary
    without the strength of
    the sparkling jeweled scales,
    slithered slowly to the
    waters edge and sank ...
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella11.xhtml b/readium/navigators/web/scripts/OEBPS/bella11.xhtml deleted file mode 100644 index c25f395750..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella11.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    DEEP
    DEEP
    DEEP
    to the cold, brown bottom.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella12.xhtml b/readium/navigators/web/scripts/OEBPS/bella12.xhtml deleted file mode 100644 index c39fcd8f24..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella12.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    Bella tried and tried to swim
    to the surface to tell the
    children not to worry.
    Without the jeweled scales,
    Bella could not swim.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella13.xhtml b/readium/navigators/web/scripts/OEBPS/bella13.xhtml deleted file mode 100644 index d58a635420..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella13.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    Bella the Dragon lay all alone
    on the ocean floor ...
    motionless and helpless.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella14.xhtml b/readium/navigators/web/scripts/OEBPS/bella14.xhtml deleted file mode 100644 index 67cc48b3bd..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella14.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    The next day appeared
    bright and sunny.
    The children looked for Bella,
    but their dragon was gone.
    They were very sad.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella15.xhtml b/readium/navigators/web/scripts/OEBPS/bella15.xhtml deleted file mode 100644 index 6480ce14d1..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella15.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Diving off Bella's Nose
    Sliding down Bella's Tail
    Swimming in the water
    They missed
    diving off
    Bella's nose,
    sliding down
    Bella's tail,
    and swimming where
    Bella warmed the
    clear blue water
    with fire breath.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella16.xhtml b/readium/navigators/web/scripts/OEBPS/bella16.xhtml deleted file mode 100644 index c135c09e6e..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella16.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Flying on Bella's back
    They missed flying
    UP
    UP
    UP
    and all around on Bella's back.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella17.xhtml b/readium/navigators/web/scripts/OEBPS/bella17.xhtml deleted file mode 100644 index 184fc9a07d..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella17.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    The memories of Bella made them happy,
    but they missed their dragon very
    much. Every day the children walked
    to the water's edge and thought
    of Bella. Their tears of sadness
    splashed in the salty water and
    drifted far out to sea.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella18.xhtml b/readium/navigators/web/scripts/OEBPS/bella18.xhtml deleted file mode 100644 index 33c39201c2..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella18.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    They somehow knew that Bella understood
    their sadness. Bella was at the bottom of the
    brown sandy water, but the children's love
    reached that far and that deep. Each tear
    and each thought brought Bella strength.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella19.xhtml b/readium/navigators/web/scripts/OEBPS/bella19.xhtml deleted file mode 100644 index ec2601b557..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella19.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    Their hearts touched Bella's heart
    and SLOWLY ...
    very SLOWLY ...
    Bella's jeweled scales grew back
    one by one.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella2.xhtml b/readium/navigators/web/scripts/OEBPS/bella2.xhtml deleted file mode 100644 index 987a06a4a2..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella2.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    There lived a beautiful
    kind, friendly dragon,
    named Bella.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella20.xhtml b/readium/navigators/web/scripts/OEBPS/bella20.xhtml deleted file mode 100644 index 3c0b79b133..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella20.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    Then one happy day, the
    children saw their dragon.
    At first they saw a magical
    golden shimmer in the distance.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella21.xhtml b/readium/navigators/web/scripts/OEBPS/bella21.xhtml deleted file mode 100644 index 52acb5c731..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella21.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Bella's Tail
    Then, as Bella flew closer, they saw
    Passionate purple amethyst
    Icy blue aquamarine
    Deep sea green emeralds
    Translucent pearls
    Fiery red rubies
    Limey green peridot
    Cold blue sapphires
    Sunny yellow amber
    Earthy blue turquoise
    and brilliantly
    Rainbow-colored diamonds.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella22.xhtml b/readium/navigators/web/scripts/OEBPS/bella22.xhtml deleted file mode 100644 index dc3726e016..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella22.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    The children ran to Bella.
    They hugged Bella
    and they hugged each other.
    Friends happy to be together.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella3.xhtml b/readium/navigators/web/scripts/OEBPS/bella3.xhtml deleted file mode 100644 index 30687a20e4..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella3.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    All the children loved Bella. They played
    with Bella from sunrise to sunset every day.
    The children loved to dive off Bella's nose,
    slide down Bella's tail, and swim where Bella
    warmed the clear blue water with fire breath.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella4.xhtml b/readium/navigators/web/scripts/OEBPS/bella4.xhtml deleted file mode 100644 index e0cf3eb91f..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella4.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    They loved to fly
    UP
    UP
    UP
    and all around on Bella's back.
    They were very happy.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella5.xhtml b/readium/navigators/web/scripts/OEBPS/bella5.xhtml deleted file mode 100644 index 3cb0898991..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella5.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    Bella was a special Dragon
    with scales made of precious gems
    that shimmered and sparkled
    in the sun.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella6.xhtml b/readium/navigators/web/scripts/OEBPS/bella6.xhtml deleted file mode 100644 index be0a5c7533..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella6.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    The glittering jeweled scales
    made Bella strong because
    they were bright, shiny,
    and full of light.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella7.xhtml b/readium/navigators/web/scripts/OEBPS/bella7.xhtml deleted file mode 100644 index ab8deace6f..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella7.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    Bella's scales were made of
    Passionate purple amethyst
    Icy blue aquamarine
    Deep sea green emeralds
    Translucent pearls
    Fiery red rubies
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella8.xhtml b/readium/navigators/web/scripts/OEBPS/bella8.xhtml deleted file mode 100644 index 4081e4dea6..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella8.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    Limey green peridot
    Cold blue sapphires
    Sunny yellow amber
    Earthy blue turquoise
    and brilliantly
    Rainbow-colored diamonds.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bella9.xhtml b/readium/navigators/web/scripts/OEBPS/bella9.xhtml deleted file mode 100644 index 2952a782be..0000000000 --- a/readium/navigators/web/scripts/OEBPS/bella9.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image
    Story Picture
    One gloomy day, when the long afternoon
    shadows gave way to gray twilight,
    a band of baddies, green with greed, emerged.
    They were jealous of the friendship that
    Bella and the children shared. They snuck up
    on Bella, cut off the jewels with their
    sharp knives, then ran away into the deep
    dark night with bags full of Bella's jewels.
    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/bm.png b/readium/navigators/web/scripts/OEBPS/bm.png deleted file mode 100644 index d679314e36d11b4a1400e4951138f41c9c8ab2ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20753 zcmcG#V|1m9wyhmil8T*FY`bFHwr$%sD>iG!wr$(4*tT!2wa?l(d!PHA_O*8Z%sJcp zbG~h$KfRA|IT=w{C`>3IARt(AF(CyYAmG;DzsVs%et$wp71RFy0yE{8<_7|*iGhC8 z{{jRgH!Lp1ujHoF&;jA5HI!EQ^?+QW7Td^^OaJn0a(r{cJv(j1)Aeu?XDX_yig^-q zq?TB+mV`m2{W^^L5@% z^fiRnd(hmdpNUo_T{WB}ISEUJW~F*@q~2g-t}OdwaZWNh1{R)9n_`jYJx7IIy3(q` z48y{LFm+$1ETvqHqOe>L6bE^3(Rg=^dTw`aPI3U5D!Br6ETvql?cp24@(R0+MvKG5 z?}wkyTkrcvb?wF##>sf$#E@rvR(S6*sd>Q1&cq67I}{AE%sl+XD((cdCKNy7pTVPc6U3@ zv&N*$7ArK_*%wW5nh^SjfAt3$51bUKRB7!PHAq!yH+k4i*BcF-9GCoDuv}CN?ML2v zzmPLMJTX-%*M7K9!U}R9ftuN1<~G;3IeTO&*Wlq|GE=`9pR+6iACi*w-Q~=pSvXy! zYbbYHon^VZ)AhD2uX7$rFzAawH94&vwqW1(h%mHv@BA(_nE;c?%u@SVWN+GF6w zc#ftlC1a?t>#$xwP*L@8w5YT5W`+0Myz=Sd@xy4Owty;`{T@DDwNj@wD!))PG-N16 zCT)pEv&Clr>TY^Dam7OCu|jz)MXl?4BS|t#WQ~(dg+}{zUSTZPct0ZPG)Jq>VgVUc z@Zc*0H#6Hd(`Ki^asR08XM?$uL4BQX$%46s)qJhbME~&oiL(hASeMe7zdOVuQuN?7nOz)^}@+y43PA6|NTj^V$7Vn%)s6^Y>Lns&OE6g+Jm&H1nzP{7sCMlV!YU7WDfNu-_tba(=K*nOdLE1jhDS# z#R}(r-Kqwb$MRR(PqSlOtfNymllKUctyfL5B8H+y;G%-X>+5a*nVFGQ%%Y?@oGi(% zTh_AjJX!erMy`9ZDXVH~YwBVg2HC*gI!jer_mh?D>rQk1+9*18MgyJB^;WBAjWLa} z^nJ-3ua`AR6&jKl^P&;++flO5v#F0g+mBxJ2J>8-(Rw4VKJc|4B6gKYbemlpl5L;ii4{)6@pr;-6FX?XCtJ9=EHP<*2<(99HTk8ayl(jIa-C6$S&P4W~=yg*A5>Th%{) zRH*St(@RPz=FK5bm8*B$99LDiKOBdLJUDMXO@^4NaNUx9nmd(x?yoK^jvQBc?@pz> z9d_A`z7+XFKKp*KKZSNhd3^*w<$R3pw&ZBN_Do%Nz9~+j>qKp|P#mBAgpqwb3GGRO z@8eV;gaWyo9|%nj-k|YDki&LpVfv-9@?KWpzZ5}ev&eH-(YdRQ?Ak%R-gflEQ+c^z z)f0X6Lf3O|U&C%`cP1KZKy^d0vKh@yXPm>A{c!X-UUMn3QirnrIL-Cm;b)F%NQP%b zo#jk)q!iabYQ3{&x2-PhW)0EH9IN-1`{fIC7qrJEtG(!>k?zfC z^U3W|r>=eXy{LZE?IoBHTTTTOd}TNk9dxJmH&jg=Y&Cbf{N5?D`-2K8yvwr;)$eq= zVjTPN-W%ML&sP26jy;^RgW2p^PR9l}1(JxOvcWj)A6LIBe+9OI@@^p4dfLX1g*!b) zZgcXsby?q@N84_^{t9fbd+l>Q7vt*WG?)^#pL`8`w2EP`r_x&^L)2_4#9_y%JtyjN zZ36eYa{0CBiY$W@!F!(R@S>KswLgl5F2O}Nh{q|1YL|E6uX|mAe4P@LuVXiIy{w6| zw~67}H12AvJ^cfzE2H7(p=DmCrlJgU2zCkNiaNS`KIchZdZ;HyyjGjy`pewogAfO6 ze-7RRH1NxzlOy>gjdDpqsbfT^x!u4O`(W5L>H`<%H8liuX<)*WrY)=|gg})fi7r!QJ>nx~1ret!`*u$JS>MQ~W8QW5l+%lzzB9p_iRjcCCYQ(m*{^$o8>wX=^Dx0`?_>^&mP z>8QcX-tbHrGAH3sC&@#Y9zK|%To`GfAb$EFA-y2cSdHSP9|$Zx2_WIIaN=>8U*kzf zEGRs^L|*)WP=G+F{Xm6)zG(S@I{`sP`F+g?f^PSNnFoS9^OOBb4z{05o)`imPZ}XS zLXN$k7nT?wpr8^V8BW2pUwD*=3&ICF3`Bwte&bAIT{|Ne()I|NAib zK0fYUV2~W5fPm!iS78E5r{H=ybPz$qVVD8}mb;KWIhw(}Gu5XNi*%;EIZ;yfF5_+ufje*Y+_RSz1gXkel+#pG2;PYeW zXnU7v=;6Ub$D-{($MxPS@-aLj55j?G%li_YZtHE^(f;zS^5Uf=uD&~aJZv*+`Z``t z@#5ScCFTNhs#B=yXaBD_sn2Vr&!6Sp+fi8B;!T{$7ceGIu14#4Q=P2I=!+S+vk5P` zoDVLNskVwirrN(&R{fCA;k7M6rxw?_*Rk!InT>okuZ}q`K^rb|lwYt*+T81(-X0RU zZB4N^u^TR*r(=A)PVaSJ-p+=ablzP*n|v>BN9opmuM#xrxKo;49Y=d)BV=%>U7Rc1 zTw3YgR2+*h<*cU7WS;bDeYg5N1I-^vYmq&6E*pZja)!klS(0OtxYH?RvAh!*Zphuq zdF`2aD|p$h=qctkk~VfuSKXX!eKiDZ0k&&_YdG6Y9z-_IA{!QW+)J1{ns|Ha+m0;+ zzZ^u58Xo-0vf!&82fn}*2LC7uiP{rkS#MU@*;er0YNFb#diYpa^<45mx_~_tY7&OH zHyXSfYJnluvGHjxqd72gecL=P&ofMW^#Jf3N33t*IvO!~#WYNtvfZxAjRyD3TPyBw zF0THn0dbYzqb&6nULcWoSdD)#A$LJ!-ag2@-CaouHQ2(FT;oi3>W}wcjdz|+ye%o| zH*M`#S9;Qrl*x#+(X_M)OZNo4r59WknnfZ`xC)&!OOC)gCP$Jt6Q+X*Cw&@4M3Q`l zHL%E`d`YjRg(Gc^Hhq!G*J2X2!GV6>kXv3Xv0{xoC#a2yoSzbI4IREibZ?SAMwc2n zoEX8KGsn%7rv?2f9TsWrbEp9-dyuoLW4AX@PQ)w2ekF3`$t%10F0kRB!>apX zKDLsReDNW_5r^(c+qLDkH!%3lYsUN9_A+PNl;dXqtGA5s99h0oH{S~FD_&R>&d!Xz zJR(=t?qmY`swUhGBCJ{R!`C7^fXmCu)(k4nEKSyTFi-~UKt?8D1n?dNB!5I)ek4j@ z@Ga)rM9%2Zb%}f> z4^sINKldN|LxaFvDnRjtP}L0RTP|3?A8ssIDIbOzsCzDgP=HJK+N$Gi~`hRVS4#_ z!XPOK$c=)VV=)8-ZNlJ=%|WCdM5Dxz^a*8!B9suRYlYjzFbIfDg`(@3{kuLS`+w{q z^4tu8RfE6)Yj$H-Lq>tLbu(4NP4I!p=#i>H4F+`RF{;6a1fJ{hs3C|1;pj`KA%h1? z>#L}t4F-Gb8>oE?38~PxQNtDq-O%??!vhb4H3(5791P<&h*v96AS|Wk@9(5SWeLyUc0wxINjWCFU$L4lMJ=Byt*rtu;X%{Yw1uC?vrEtZBT6K@tyUZ$>Fjn zoRfFFy_xFZ7I_=bW|YgRc<|97cxz!b1Gi(wKQMed;TUmI^s8dbjVPm`NSy*{-EQda z8^^`QNmO)svlGWl)t1ClRTXTrmJQs4Eqvz!;!Q5=+ksq|sOa!UqugU9gw8HS=f>Bj z(AmrTpsge6&aH39-!qSxGxrvdohokqJuP!RU5}!#MfvA~e|l2@bITWn?!srpyUOh0 zSVAw);Oz2T>G}2*=+=97a3=rSa@h@xzs)F{I-+JcDt> zf^1_zLMJ}?P8xBc7V$1*-C7)uzCe)RzKPsYBplsEayjZYITF5}fc%AQB2~Nd)a>P> zZ~{k z_>6!}r0|@`#3`Y17sMLjd@H0DQK8LH!c#^0UD8s!!wtgAN5EC?Fi$?Wd(Ypxf{3Ba zwvbE_a;wCf)+x&qy&ye89|O4{GLSw33;`m>HX`v)Bzk@1_GFN7vt#;(Ad9az$wuO7 z{o;5Cejt2ETXWqboIioTXknU7V)}JMrt(2mcS8>=s{&&$1Lq*gL5}jvlf!-iNTEc= z%d?G&B2tiiDJVxtL9z_4lrH*zzBTj*_ak6B2s(+u0}~4NhY=%^-pmV~yzm4FH-@2q zB{JHJDvo0T5j_aQ8L{kjb;m*OhN1_v0(R^sq=z~Knd|1DN3a6>-lIT|cJ?Kq$ATW) z3gWgWfS&LSQn5Fkp4>{}dl|NC6!dFve>EcvtY+VOHCq&1Ti;zZ4-5iUKTM5K6ryK8 zag78SL4UuQuBWD~s1CoPo!vXCsbh81a3s<-K_NyqFwrAdXuCFNWj5u?yZL&RkMrf$ zM-AyOP|JyLiUZf%nM6cswyvUFTZpY~G{1N`1bjD8A5>&VljGVQxfw29N!#bXJ!^DK z@y=^KyI0=&ia+i7665$#xJ=nb^t!m_0-22usFC{7M|L*EICD173}+)by23% zg?D-a-W!W=YL#@*lS0Q~4}}woid}IiIapG=6q$197dYUFZI2^Y=5g+?-7X$hhf{93 zb;KUsIC-xE?@l!hW#1n*Uu{jWpNc8oTy8tC43k>8uj3}<`Mqm;Ku1_T0(dZ`xVLgV z+jw`++!O`UmeTq!J7!--gBN|-5k6U`mOOMbsl_pAC~>N)zR^wMj7sB-ieX4aoQ+9k zk4sy?K3rVgo_QYW?rg`oJUCrD$5854l|qYBUSw7{y|SH-7MygSi);EO+1&;Iiut_X zY?Qs>is{Gp`0n)BMV!s4=Jvb`Q$>?jdAa}O6MOhBbJvqXB-?@2wcE7)>J#VoP_Vr5 z8Si}G@g&F_&HI+|>)bc%VPxwN+neXHzj7VfmPyOIWqZNs+#4d`AU|w`FSC63 z!(cV|-+}_Y5D*mvdUdV6kL>Bqc z-OOpKxUu}rD4M^#9{Rt^h*TJrz->Lw)EElfskn=wzy^V-1j%6x1~I9`D&g81PgCQ4T-+;58!MY> zX*xCg6$E(bahRkA0To|eMc=i^0PTY|IVX<1a`lIO%_+XgHJ2^drQee=lesuK1$`In z9+NCSWwAhc&c~L&CtjIMz2h}_c;(qWwq|De;u=E?UD|POdL-FRX`_k; z?up6nP2KK`tS}`#%;^u%1xI*uhM%=vr+F8f-`MVxw(h(??|yxDRGk%h&VAm$w>QBz zdbDIvQ3-W)nGM&^AIKhtz>|o=6$-m@v#p?@Oyi=>*zIaqs)@}6L)*8-fZKXeJzt&b z=XAw8yph>+epF2FKCYN%%d+3&k>Fk?>TakVU%z@S8y?j>#O4k7|H|mn%eX5UbY%PLaRNi~m?aZFSKK^hT@?LcPeD9eTG&CP7f&vv* z{05a%Ih9>Hl36;=s9G4q8^M~CU#*9DE(~CiW#E{-={3r%Bfmx= zVHIAqR}lvUeY^NU-bEenLt5MPyU>MTlQ;svg$_v1G3zLVjC2u#i-fKT>!E=iuOQr_0qdTEbnwCJsgPIS*nHWJ8(eQ?KSd>)<~WH}`exMQ|{rc<3>6`as0Jj{| zI#QOu0lrp!oBCLz=9r7CiPtQGbNk(asQ41==GIMJ(0j&cl`i&F#QBeoIjqN@6uwmj zPcFU!V%HxD;!~G4JV&%#czf?%nzcSH9eb~yt2!OiUN0WLCMQZS`*Fj99W|4Ih;%Sq zUe0W1U5}z&tm(&FXlFWJE}wy}*`8Miyh3=M4DT1RQ~^4rUwtcXCdXiZ+BSfH)*kmr zBBy>@ACtQWbTY2WmFs)RxvB6q&3Tvz-5Kn z8eXy`)=tM0(A)QOAAYlezpDU%U~7S6$Taxq9JsL=2tG^z0Wk;>R{*gR2&q+ouTz$g zSZKajG?;k8KQw^f7dt=5Tt7)r*rQS;KSX+e6g_|RSbxlJf1E1{;NVV3fgY4l^)L&W&v;%}~pg8|7Bkfuk00sRm#!t|p5-7UF0#4K&m!KR~`!$AqRh2;re@Op(E_r{^KJrk22_2d$Y z?+~`DFVo#c*yTWgY~zs6oh*?(p0v^Vak#fJ+ugwC>sFP$PrY zqwu}p%%o5p9XOP*X7*7O;yt{uaO_bu`brZiRF$;SIubkm+f(cl4t+<)p1er+4M`s;G6RXY1Po90W(C7rOibtw(Ra*g;f6NP1bIFlga1 zU3yixjj!WG(m^WD@g^s7qi^a}kLSSVkZ63L2oeCoaAmS>9?g?yKWRdK>x2I+0w=JG zee0&t^7XlSQuh*j#Y5dqwCRF_`|e6#b-pwEYN?GVD-aql)DEN&k!N zlb!S`y8TGHqXkP;6E3RJHmBG_zjd26`6eei*~ho`MHH}YJyUPrdh&byK((B*1Ux&> zG$`L$H92{ahdhL3Ya8q|V=R+#G=+ut8JwkJd}u{kqiVMaUD7f%t43X-dW#Bu`Y_lD z+}R>$wF%8tj+AQW32PQvY~s=^FXlMZf8P;1?dub^$>Da3!HTps&U~+rdmVOlh3(fm znp|H)Xs@Gj^X!>8RM5`Ga=R*|FnKjv@s|I_E1v>zH#U4x5}tRHpBAzoR}-F96W&p> zt~GNrvL35bDM<0uzV|(6rD*$2Yi>v6-eN>SQ{G=)#!djB-_?A`Euhl3ZvMtgP@dgY$Mp$jSYsWpp2yY~mM ziOuV$$fu{=8;2#E$)l54fEFQ5nqIEr`rZk>va%D262XNwOCNKtOF3&?tuX|H)t! zGK+xaA?Q#HxBZiQPZR_am>nM~-=8n`s{ubFB*Zg5VSZ38r%816QauM`kfH$wH7ap1^q@@nXb-~0~-4C^P;Kk%QT z=f6t*|6#Oee3v*5QUhp78^qVSP;A|%G08t?YFojjl1A8WnX!305f4vbyKbcW=q3(m z#)AqipPv|tBDuV`9=|x!H2G%xeniJk=~zd$jn~^&L^Z0^+{co5+|-}nrav8*(vRhZ zCMS-8ehj7C;*z&Il=A$t7)XLn;_u;JA+e78x-p;}2ust;wZ5sQC9kEP7^{Pju&_8g z$2!l;$g$2!_yX?nA{qiA4QTSL@2F;)BcqE^N-%h+S{uWX;i)TZ)3KVuw+#&-Wpa@Eh6bjA2`a-L`V6kBk9dvF-`8hr?92Cw z9LI1OJft958QkR*dt>XWJ)k2)>2*8C>LHuo1X3gr`ISwrz{DbS5vI7+$(j z7pQ_TFO6p2vQFoXPB@sAJo9K>WNU`L>*2DyE>_Yj9Tm^Xk47%(4JFgF-^kM8@6gUl zuRO~J9$lkdd9b8f3@gR5E4__M$FON6Gby1m#Ng|bMIzJHBn9J(4Q3}BT$Jy)Mz7Xt z-#3$EUhysv_GJKDdEe8SU*Fdae}i7mNPaZ+83QIkCLtMzyob@kct;4y3otY-_Jl)s z3iqL(+h=nbP#nOo-NB>^gm~6~7|2xw!Q-vo&jDmvPxS%;P^><}Q$Q%;@ zG5NvBff(??i-9QP|54a^Lw~t`=1hTBazA`>@rZ*W`i6436<@lHfL7Aix8n{|oDzv5r<_!W6MX{|m$WTVYRh zj_%a_o#EL`lGpGU2YMK0Hb|nS-o$Hl%1x=yVPBs9HW=s}H`mT;t=aa*g~pj3M;A(7 zd3HN#^{YN_HeY?Qyze$5t`xc1Su04IL>XFB*GBR&e~xsbr$vWxt+Q+rV16Q8=bD+kftsRJKCfJ-w1jR!FWWBUMf1Rge}0cl5{wZ*w{kyY$m=Fi(3l5!FrW= z=b>_TC%c`$ln7|d*ZJ_?-H18C^@?}di>{r7fUDCHQZb0?=% zkZS2j-9V8%DDY`t^_eJyp&DOK+y7%WI)+7$_;aCTqswbZ9 z^@gd;Ewb~vM8y0>LA8W*N3k}3)0Y^LI*3(DjaFg#K(~3qQIqWUUo;Ss8V%sqJsN+o z_j45~;y)^Pmi>P~@Bc|s>PW~)QHTgkDCxeoZtyAXHh7i}4~HDZrlL05x(?c!yfzETY8h4O zi6&N=m)gg)>wW7dNZ8olX1F zrbKkAD0oCvY8@fLM_?Ugx6Nraz|lu-K&(<(bxZQGT=5NQVZ@u zXsfZ&VMUW}+}Z$tLd&z9^&-XCX39AT8!L>)2^>MzBV- zQe+UN=`LD<7-NouYhi{A%0OZEGB~N#9X2TQM6yG3$EUXcJdEO?oV=apq)%Adueg&Y z;?nNXo$}g67hm zg!zIB`62=N;`FU|PwZge zEb4iTA|-vB)Bq$1M@?;QEf<(zKvu6T>a<<*NI!A^5zF3wo9t-bkSsiO?b7GzBIE3mJ39 zgzfyj^t}GM0KRQV$kX(95KGQf({?7Wusk;`v-=38%kQZUT_do{sb4F#w3A*QPw(Om zsW8;w>PK}oMhk6F3_T8dLJo979sSQ)WWj+p%S&G^x8u4u$Jg`=H|N6V$P3Du5$R9O zgB{tINETIyH%ZaalI(s*@0mjm0Byz%Xt}VfsAB+UAT5dRHPqVmYbn+zebS4E>GI}9 zYX3u+C&d~s#e>V`2ptl$dxfja!Q~s9`%=M8eK{@7Krn8?#01T^p$$yBOWdf(bDtx1 zmnE7ZcU|8nVR5fi1R8Q4?~L9D=;bk{#cJtO7ITPyhm|V$jY6)g~#i-y{UjHU4nmm z{rEqkV)^QGVsI?M>iX&!=nuhvB*j*--DauwiK#YZ)nlC$-YmvloXtJCW$YMvT5F}E zolvnKLp>nHaj=POCeWCxm(0I*JGX?;_FoUo zuxXyjxx{icu-(Op`I#BCoj6?69#qpizAj6b;xpb+vUA-IQ7C#CqPQDkXppe!PIc4! zC_Hoscuh=gr5S_^|LQt(tg&~^e|HfbuKLJzx3M*g$T_WPk##M!5h#?JM;uK8;&364 zMR+U3ldyVr(ZBx21PwqDwAHj!@sjW|6MA9(JoEEhS(+-+eVpiYYNvbI$euq3RbTVm zX@oPnU7~9X9*~Aamj?8qOVQ}yJiAH;P8H#<=y>nD`JVM1XFgq@?OjWB*4R%doHA%1 zGN$?#6YO1T5c;g+e)>p`cb@p^?(2RWHg zi}=q(aR`P%&6xst74%>P|j5FLo9e~x0dXvs1u)@6EpB1Hb;fu zs-O?CA3`iBfDaQAEDaxxIM6N@o=`vnQlhOP`fqut3iCgr4}EDjQ&=rZU{m4WbXb%6&$DH_8{xU;1 z4Q{Ot}fmNGbWxLV!YCCxKb;)xrowU`%X=jG9UY%@o zwd~Zg!*i4m_Ip%12Mmqz_xH}8@p9(2>?O)r+yptyGvm=Hl)e&!DBE-Ul;len;qXnr zaPZIaT}`aO4vyVEEKqI;148L<&x_++w?tJv%~KknGAiy`Uwt3Z3mCdk6={>Bnp+;KxD_oRmYm*(|Vv+O4g}b~KWhv`t$Qg@} zSJayPQgH%VRt?R1)3X%f<4~2;adeg4SO>N^R~%IzN?0T4yw_1)kCjGD7gslW`v=;p zs@E|ou8W%+*_YfEYnDcSXkKt{Hx1Sy2?@5CiJ{Th11=JoZ{NeuCi<@Fnnb;p5nt6k z6Nl7X7Ufj5F5>dsvqh;Ub0)ccC=VYt8o`;lhoAXq-|p4rjGvSHA)Z~wiE9lM@w8n| zA+IvSI=GQ4-VOL3w)2QShQ7GUjM=zkZEiRnRg+tyK2Pk(XFco*t5ZQdhk-Nw?#zE@ z0JANaW;R;vkK~!|(y_DBCfM!zQGY?b-`rkZl50nh4+shf7!4L1-+~;1mJgHz2u!3K zOu=vA7xObPvmfX`Ylz=Y{m9IOftL$u8cFOO8->QV7A=nAq{LnoS*#Hfb`mjn%CusW zTH5%WI{3d6JIy@TloXMB3iSUT*<%_3^Cb9VO=0>S>ir$h2~mv00{oT~LH+-i(J}-=98rgRb zoP-nEscOc@#vX@wsbSpYr97Y%qf#N!35(w^Ud2;f5{H6iQd^zZ3Xv=aLgbPF9-&pQ2|K&=UAl~o&+pU%i#x#y5wjNjz@?RFZr1J;O2 zI7RT>Q=z6}&^O9pugW^k<(=P;-Zwbo1Bf!HEFe}_O-reT$pcgB62bV(B7|xoSg3qwc6zEM_SJLr;R4xv&Am&=Grvg;3F5!;&2u2drS{r?E%Hw^AF}z z0GEHWi6^gp;{7pf7VW9E8pMN8mGf;Dz<-FS&Js{45b@6vt1FP&&q9FZ0wL%DW8;I6 z{{msk1?AHNlfwU^_UnsLF1Vc@gqH*#!TgH{t(bEM2^AZ+;&h91vWl5q!ji%&&oaz6 zrJqS;5;`Lk61|mVsXp1s^>LCc1KbTKnE~T+my;}~!?!)AIsMNt0iJc6` z-dUnO$N5YqMlc`bS>_GQZ~i{Ni&ebEUth%_9>i4(%`1FnF>7cui=>0%O7L{KG%}ts z(`cn2vShp67CYNW4$GZx(iw*Jl7xAV2 zDF-xwsPj{@N+^-NoUsjyDzJMfi{Ty>A-@aJw56Mdmf2Q!wGjU#eX*;&Eb0?4s&Jd0}$K!w(ikmgX-Ab0bBX9K7Z6ZsPWJnvjN|&PjJQ*{c zGllK5L4&$jLl(nZiIL0Oe6Of98iUDkjxq20;dxT7tLCmgTP_C)z9~~OM{2Moe3|n+ zKewp~u0;M~d8^@jd8fv43|Ip{M=efc*b56rIUS zQf@3XcwYp{kiV9!d&DP1>+qkn3ONY+Sl}o9PC8pi#40Hzv=Wx)?^|8`%`&J f7d zCj8G~p!9Ogz&|s?j%j7TtZ$VwmzriIH63&~%IAa2%Rek;?e;mU*1YsZ>r&Pe(5Rtz z({Ck=@jX%u&01OrtmV?G(Bj)MQrJeP3aM8`%6UfIY1VtIR-@C*NS{l!x^qp_LUiP7 z3#z^=BPb@&5e9CiDClQjREXjNkQCQ@0l)T>g zBvT)aOisk?#SMqwHCUITIv{SVY*9@x94$STQ>rSGw!FGX&wtQ=H@%UYYbGvW1aa4@ zgx)(*_)JVn-dog7?KXLzRmcgjDrd!1)>xCer^oE4P-R#(^ssXCDlc!UEAJ{Z&+Vw~ zAnu|*<+t`yyM7;QVX((B|9Y<~pAYKAHGjjixLED(*y&R>>?TGc~K|#=_pz?+> zSM4Gr&WCBmNSUwG!HHg&tgY3wT##?U(gMhoV{(QKsA)`N_TCa}g!_L#NO8A) ztC0~ghECrc>Jm%%ubl}9ObrMk3<#Ws|%NzVkd#4HfK z?d!2E)Wn+a6dvbPg41Opwz;LX9-%c2_~EF)kiXyVY{d#JKrwiF?H9UZ(hJeBdQ~P> z;HFK|#{xfl_DG;%+-YbCJTzIEhTFs9S`McT}+-!2dPMlU@sp0Q$!;Uytd9saRGOm zEtgW3Qmn^o#uBv^w+wu_&f2J=(mRZDQH{RHf-Kid?7@DS1DFNF6qHilEYstM72X|b z3Yi6HkIJBhlg?4qR}{QEwqZD7OJ~c~FONT7vx!q|?%`Vn1Gak=> z{e~a^i1$niQJiaDYr_3RQ&Gq~A=D#)9ouCzS=mm()ySP&kIsAqj;hOmfgY2!O<@!O zH7t;Vk)mG?<)00q=ux@yP}{SUpg_V~2(+R==MMbycqjTzOz)24pRad*kp400Bi`ds zchZmft(li2R96b(E3&YS#a@`KlK^0}+QAQ_3I$Soia1K@V{9Y^sP2139^NHv_k&Lb zRV8bqd|xI;UdjaAOUTE{x8M~HigRFLa5<`$?{M|iIse zh1L-(j(g+3uVif|__&v|)H4iJ?7XEhK2oJYJoe+bslQ@*G)hRrLTT2l$yBkmntsdih=R(;v*9~X%+A^#w&H}8gVq% z{_$DEuiqQ*lSJ=O(X0IX>7j5(6$Q^k?exvS%|z?~ zU{6I`oNz*-zALZeY4qH~Hs$&*^=E$2rY1UR!eyck`{*Ch7JR%JKNF_xlCVw)P^ZS( zS%|_QrpP`m4i7b>!$$n0Yb6rJ*4RqZZbe6Z3 zsgQq14}Zr=r6IE_|NZJjTI06_BbuJn7>X?vTKx!{@}^0L@ycRrN&d1bW(G3};80zHWHPiA*@}916P5^ML5t3`Stw-lwz#K& z{DCFeIhT&Qn7+faiA3>Y80vUQjN?{AaZ-%X)9a)wHF&qDYgvBq+M$rvXuPOE=|dm0@zD67SD9N{yz$ zh;`R!7W?9qI2K!F^j#lv>`qNz&aR|L(pKu1-g;lQ+~aoG>0d^p8H*yKbx3L*JF`7z zlsN$aQ>8y-6tkc7RmqP$7gEy~nNMc0o2m;)uX~7Z#$D1RY!QK2?Yc?fBtW}1EKqma zd~zK&Z%uW`ikIWO4D8DvRz811Af(8@YF9@cid#a&9j!2SO6fic-EApQ3YURz&*)4Z zHOpuk$CADP2N(z%NrpK+xxv|GUG34uM rQ}7u1xn413cIClI|9BDb^shDFLNq& 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 O0000 Bella The Dragon - Original Edition

    More childrens eBooks from Catto Creations

    (Touch the book title to find it in the iBookstore.)

    Bella The Dragon (Read Aloud Edition)

    Bella the Dragon - Read Aloud Edition is a classic picture book about the magic of friendship, the sadness of separation, and the joy of reunion.
    (http://www.BellaTheDragon.com)

    A Mom's Choice and Global eBook Award Winner.

    This Read Aloud Edition features full page illustrations and a read to me audio option.

    Bella and the Year of the Dragon - Read Aloud Edition

    Bella and the Year of the Dragon - Read Aloud Edition
    Grandfather tells Bella that she was born in the Year of the Dragon and shares a story about the animals in the Chinese Calendar to help Bella understand the importance of overcoming fears.
    A Global eBook Award Finalist, this Read Aloud Edition features full page illustrations and an embedded App - a classic memory game featuring the animals of the Chinese calendar.
    Awarded the QED Seal of Approval.

    Look Around ... A Word Can Be Found!

    Look Around ... A Word Can Be Found!
    This cleverly illustrated story is sure to engage young readers learning words. The detailed, vivid, and unique perspective in the illustrations are hallmarks of the gifted artist, Amy Joe Gracyalny.
    (http://www.artbyamyjoe.com)

    This book is a fun reading adventure.

    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/books2.xhtml b/readium/navigators/web/scripts/OEBPS/books2.xhtml deleted file mode 100644 index bc09ad41fe..0000000000 --- a/readium/navigators/web/scripts/OEBPS/books2.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition

    More children's eBooks from Catto Creations

    (Touch the book title to find it in the iBookstore.)

    A New Day

    A New Day enables you to share the day's activities with your child. Interactive illustrations demonstrate colors, numbers, shapes, sports, dates, and time. Dynamic illustrations highlight the world around us - moon phases, calendars, and clocks are all correct at the time you read it.

    Discover A New Day, everyday, with a child in your life.


    Awarded the QED Seal of Approval.

    Watch Me Grow

    Watch Me Grow
    Now you can watch your baby grow with increased confidence and skill. This concise book embeds video footage of key developmental milestones. The narration by a licensed pediatric Occupational Therapist provides practical and relevant context for interpreting your baby's developmental pace. This helpful reference is a must read and watch for parents.

    I Love to Doodle

    I Love to Doodle
    One of life's most popular pastimes, doodling, is presented for those who like art, math, and/or computers. This short book shows the artistry in math and the math in artistry.

    See how a teenager and her grandfather have different approaches for their doodles. This deceptively simple book provides a step by step guide to one teenager's favorite doodles, free-hand or using Scalable Vector Graphics.

    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/books3.xhtml b/readium/navigators/web/scripts/OEBPS/books3.xhtml deleted file mode 100644 index bb5f3ed16c..0000000000 --- a/readium/navigators/web/scripts/OEBPS/books3.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition

    More childrens eBooks from Catto Creations

    (Touch the book title to find it in the iBookstore.)

    Bella The Dragon

    Bella the Dragon - Fixed Format Edition is a classic picture book about the magic of friendship, the sadness of separation, and the joy of reunion.
    (http://www.BellaTheDragon.com)

    A Mom's Choice and Global eBook Award Winner.

    This Fixed Format Edition features full page illustrations.

    Bella and the Year of the Dragon - Fixed Format Edition

    Bella and the Year of the Dragon - Fixed Format Edition
    Grandfather tells Bella that she was born in the Year of the Dragon and shares a story about the animals in the Chinese Calendar to help Bella understand the importance of overcoming fears.

    A Global eBook Award Finalist, this Fixed Format Edition features full page illustrations and an embedded App - a classic memory game featuring the animals of the Chinese calendar.


    Learn SVG Interactively

    Learn SVG Interactively

    Interactively learn Scalable Vector Graphics (SVG), the graphics markup for the web. SVG, a World Wide Web Consortium (W3C) recommendation, is text that defines a graphic using a markup language.

    Change the attributes of SVG elements and see the resulting change to the image inside the book. Learn how to get started creating your own SVG graphic.

    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/books4.xhtml b/readium/navigators/web/scripts/OEBPS/books4.xhtml deleted file mode 100644 index d867a6d409..0000000000 --- a/readium/navigators/web/scripts/OEBPS/books4.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition

    Books in Print from Catto Creations


    Bella and the Year of the Dragon

    Bella and the Year of the Dragon
    Grandfather tells Bella that she was born in the Year of the Dragon and shares a story about the animals in the Chinese Calendar to help Bella understand the importance of overcoming fears.

    The 11" x 9" book features full page illustrations and is available from Amazon and Catto Creations.
    A Mom's Choice Award Winner!

    I Love to Doodle

    I Love to Doodle is now available in print.

    This book is a fun activity for youngsters wanting to draw each one and make their own book. As they grow older, they can reference this book to do their favorite doodles on the computer.

    Available from Createspace and Amazon. Createspace is an Amazon company specializing in print on demand.

    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/content.opf b/readium/navigators/web/scripts/OEBPS/content.opf deleted file mode 100644 index 778d1ef2b5..0000000000 --- a/readium/navigators/web/scripts/OEBPS/content.opf +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition en 9780970263308 isbn Barbara Nick Nick, Barbara aut Elaine Steckler ill Jay Nick 2010-04-03 Bella the Dragon is a classic picture book about the magic of friendship, the sadness of separation, and the joy of reunion. Bella is a special dragon with scales made of sparkling jewels. Author, Barbara Nick, captures the mood and magic of childhood stories in this charming first story of Bella the Dragon. Illustrator, Elaine Steckler, brings life to words with her exquisite illustrations. This Read Aloud Edition features a read to me audio option. JUV051000 JUVENILE FICTION / Imagination & Play, JUV012030 JUVENILE FICTION / Fairy Tales & Folklore / General, JUV037000 JUVENILE FICTION / Fantasy & Magic Catto Creations Copyright Catto Creations 2000-2013. All rights reserved. 1.1 2013-02-05T13:00:00Z pre-paginated auto auto portrait \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/cover.jpg b/readium/navigators/web/scripts/OEBPS/cover.jpg deleted file mode 100644 index b240c18a2f0274d2f03fde047d58ef9e5783e81e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163191 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 Y01X8HMTYr5Vt4;MA^87%4g7ud4|2-&1ONa4 diff --git a/readium/navigators/web/scripts/OEBPS/cover.xhtml b/readium/navigators/web/scripts/OEBPS/cover.xhtml deleted file mode 100644 index 1dcee061ce..0000000000 --- a/readium/navigators/web/scripts/OEBPS/cover.xhtml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - Bella The Dragon - Original Edition - - -

    Bella The Dragon
    - - \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/info.xhtml b/readium/navigators/web/scripts/OEBPS/info.xhtml deleted file mode 100644 index 3863ee63cc..0000000000 --- a/readium/navigators/web/scripts/OEBPS/info.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition
    Upper Pointing Image
    Bottom Pointing Image

    To my children and grandchildren

    ISBN: 9780970263308

    written by Barbara Nick
    illustrated by Elaine Steckler

    Published by Catto Creations, LLC
    http://www.cattocreations.com
    http://www.BellaTheDragon.com

    Other childrens books published by Catto Creations:
    Bella The Dragon (Fixed Format Edition) by Barbara Nick
    Bella The Dragon (Read Aloud Edition) by Barbara Nick
    Bella and the Year of the Dragon by Barbara Nick
    Bella and the Year of the Dragon - Read Aloud Edition by Barbara Nick
    A New Day by Barbara Nick
    I Love to Doodle by Taylor Beres
    Look Around ... A Word Can Be Found! by Amy Joe Gracyalny


    \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/jewels.jpg b/readium/navigators/web/scripts/OEBPS/jewels.jpg deleted file mode 100644 index 2da6ecf45ec134adae464fccf08a71cb8c59e37e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66151 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 diff --git a/readium/navigators/web/scripts/OEBPS/ll.png b/readium/navigators/web/scripts/OEBPS/ll.png deleted file mode 100644 index 59d4e1521c49ae9f651d207506b09dced93e1fe9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56578 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%0DP!3^3iw9SOk8LW{Y+jXc|=w?FjZ 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 bgPQ(-&wL$2B&)%R00000NkvXXu0mjfZ4D0q diff --git a/readium/navigators/web/scripts/OEBPS/logotail.jpg b/readium/navigators/web/scripts/OEBPS/logotail.jpg deleted file mode 100644 index 7ff90b63e92143889a6cd7612f7feebd4025f633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23756 zcmd43WmFtp(>6K;mq2g`?oNadtbY%y8q7qT?f2Ul2eoeAR!?E%%69_-z9(y z00RvT9Ss!&9UUDL69Wr}=p_y|HV!!fAs!LcYZ_{**OZjBjNB}=^qdTol&tUAIC*&A zzI{u>A`BGb6XWK8%lFSskT5YZajrC*liD%*9}kuIVDy{PmlW-@+pd6N`kDjQlkdGYcyl`&$9QcS6D< zGVf*O9=Z0+nFJiWYqeEs}E;h!TSqrODPK)xj_!1hT+H@%|9!*%(JK8%?H_dwMOh+% z#y_Isuld%-7mLUW0@4!>*bElYtDi*h4Pc^K$o1U}j0Hhw2r?A)TKDXaye#9E!+T`wBr&f6MLq3w#?B?5vp|IPDYBYByWCzQ+Q6zHJTBi56wkg^=(rzoZ<1qgP-b75C@`I2XQ)?(* zz5@DH6{%bpHeZH;l zYrpwpaXw`y3;YFyQdbKAfuZ#G^N31jQwc-MgGEq{S%XaC-a-{;M8_0AO0Pqu4BD`u z-w9A&B9?Ctm{&kANg|VdE+;i!#0wER!Yt8W#Ql^?tVDLJc^!kwsHLKD6ud7akf(^-*e6P|@`3of zo4ooXoRA9nz@HWB7Ng`<5(KxEs9LZ5E!Cu>WoUB84eOvh)6Q1<^)H1z|7;I^J3$vd zo|;W!pDH=VWOg_^i#oGF9K@~0^w*tnXM4d~w6JqFl9do={TznEmdP@52L~Wx;R?=Q zQ)=}hF~5`HzZ5f&&o_+rx|2=u`A)3!#&IU+oI#q<)%PZNTKA(mB%eDX8#s6Pg zP2a+T!OQP2VhmZ4SPKi@rlAt0f6vfEvK!TGo^d+nV@xAK7S$$^DEw&bm$A74_7Tis z6S|;zWK+_W2O8_J2ef~RgD59O8)S#*kTYIaf^PcoYk2k%nR${+ZoWY#Piz)iepe003Y(3$SQ^Bl;uv`r~7oEiN>%q8WCf&k5`H}w7Y}gkM@nP z!Ggb!KRe@Bk#A^&avX9!gNcMMwwT73!IZ5zvdHb`x9P6iQ(U{*uP2w63moy-m2x&e z{RKe%FDv%U%Ql@30&0YflU#>kCqA!ry3OP+PFKlgxJ6L^0+{nB7zLpm$yC)$v8m9l zSCWs>Wvk@6uS5Vmu-Z8EdcmVVsb;m!dt%eJh`gNC`<$U>o{6oj{mP@5T6-(x$hp?k-Zo7OSw$vtu!vOc9T1{GH&x>wukajeS!6L0L!O?4$#97t}rqAQ${7cD;P1hGFS&e zQ|M$t-gDr>viDY1bUyJWBwg%`v~M_H#(ASAf;3fKV(WUec(BE zwz9SQ1pZMLfkM2#LS|2Q78Gtj__GF=+*GvgMrltS9aW47o^_TmP!O9c`hatSJk;wo ze$3EDuKKk0&Ov?@aLOsgd4^9|t?N|bra5`j@ZAxgm`FBQ3uEyPFw~r$Y972RTaKxl z5jw9AkQl$8@Tzfm#{(}OI99kX~p5bd(WHLW8$UK%_4yK>ELO0+w4Zvu<$n9vVIg9OIex)nW- zMwp8!&h4#lQeKsksA2~FQ0z})#VJc@RA9UpcqrQbm zbxIWKq?|9FBX6-L=Z2=}fbp9={DAyZ=dc7Ri7#(wQ|{l(&|*`j+#&HuX+ikZ*7213 zL_M0h(#JI()!umj3EZ%B=#tV-Y_yio#{ZIlmn)`I7iq%1p}kbtHSoY_)c8wsrVGnNzJEOXGYx=WlBEMB}Zm~Xd}XyN|Q7<+?*74vBMn1#IS#|VbC)1$r%R5AI~*YyXqk1g+)0J>(}SG>iW-*l*L+) zs;@u-DlqHTXoB{bjwsg1mkT&(Zt+x}1g7;5@15_FiHBg+C0iVL-OV(wWGKg7?K%A2 zM|K1tbQjUQ$$-l)q>BU)R+#fkOX+F|8BT(Ke{eP^sn$WOn0!powNYj?qyMAL#^_k8 zw+%?7rD>>|VScLC)F9v3F{Nkp2eY!q4Hgb82uJa;sj^n}ETV3Rewt`$tc~AU6!ZSN zN>z=(=WDZEf4~*4C5pL%prvY^rb7 z38pNrl5o*o(By6*D&)EDyIUD_j6qm^s?rFZ5s*OP=w;{m7|C1s%$Fyx=#5dET@51> zwF6P-Gyk8qwLOE=e*yRulI!P+m0zr9iv9wEnP|8RWD9=!(xe@Z+F(dMsCK@bkTcq` zJQDq7Z(VUnoA$xpXZ@Jal$+80@HPH8BCh?=NN%ETh5I+KT-JpwZ6s@u_v6VL`_&VE zJZLWrSeLtuVJJ28WRLfg61RQ@M*xfFMeE65z<~Sb!gBBmjm%WJYbKA_%?lpYzJ7yY z4@~k6&*S)hnBU1@(QohVUe)T}Ap})2Mb6nHhnn&ilC3-RPnCuGgefd{pc@#en_{Wm zjo=S_$~VaUB~e+<4BwuDU;i2`Wvd0*8}#KT|IR8qi$ee7rO0BYk#nf)o$12~E>599 zLKZ4_#ZcWc?81qC7@#^XgqK)0URLI4hZZ#6`7wawFHTLVj3(h~;=$?TtezVgM_w&l zyGxf}1HjwqK~7f#>ofP;pJ;r^BOO`q8T?~-e;NG+RAn5%8dzWvuw%P^DOn<&>}T)N z4$;(*vjdcgK&!0t7urX+awSp9a7|_Q@|*Ynxa$ZU`*1N+#fS};BAw^cjMhv9-0Yir zmaeXt$a?yFzsq^6aDpj>8JdOk3#6O0FU*fsKW)b8%Y61O{`88%zueggMX)wDim|Rw zYLLag6V;Ca{U>u%Yi4g#<7cs2&P>C1A(W`=PTlv^e*sDpVYahxr@UXbz*^b+cvBtU zkXtMx$OrCq^qssG1O{w90|OW}Uk+?Y4@eB*Bzm$|tb_Y* z&Q_$rOw_eb1sJ5Q=of>MN&vs8y?=w8b++~$_QL36fLE%U*gI@y6j?brJixZ!xbbw$ z%3--~+*fa$R5Si`o?j#bJ-I;fENzkgvV%}qBZ1L7MO^j7NptY<^dcVW$! zM4S*k#UvM6!qw3iBK_OF=EW1i#xaeag${=HB)+qz#@yoP?upRsvwedaxd#8%w1MiV zehUw`V45n!{WnM4u2=TQxzi)nG8oA=O<56L*b`Yd5`{9lhE5K}{)UEc>o0j+j;*I$ zgN9C6J~R>ZBa)AE4^Ycfh}ZN>#yCgwj+UEK_v; z@o;_{=Uea6uT*f>$$*Y9=Tp&n8Q_#7xU@8*=wyAR6 z$8C&u77#k2LYbW$Vjv)p@Ct}G_r;-cs3}!;C2tvRCDB9SVe)~jV8WZ8v^h2QtNnL} zT9bAyzG=El4*8a!i>5}z7>h!C>i@knR2)CBG=O9PN2yZZNI zmsCd!CW-;pnqLE+5LK=2(VM>Of@@L>J7+WOSHbDu&Bb+hn+~BfxcDF-_>5>ee_YwC z{;4&asbbOI)H^X&b5f=Q&9m_%P(wb*9{`$m4W!QWz7}^MU`iH!g&HuA0en6hJ>mO2mpui;`mEkj(0Wiq@p4$5^( z1l8ST$!D!urIYc=zkoTdq0Aq@mM#RHiqBIHPBrwM!WGCTny}I}CZM=R0%k_p-hm?I z$0`2h8;ORSe6gfye7rYNv>qTI;%}br-Y|o}ABx8fC-O1CPI%W7L!2LD0HFydrmw#> z}8Ih~quVC&gcrGX~cp#`?-YB~^;@Mk5nA%pl)rl6-*rA1+#WR{NyLI9A{ zMMkF*qSY!0FwtCGNnDg|a2m$SC(9PXF^c`kdKVeUmP!ipuWzgg7THvul|Q!{sr<|{ zwlQyI9+&mHvN5$$ugcb9&>DrXjzFH$;h2`}>34S+1{?(;z%Dk%9l%8a`gGr}=53ZeQ6x<1s!LC)v z+9zwu@%|xAB$1Ck;xf2wRp-5do_2a99aee?@tFeC?1;S0l zmb{Ddk5qZ?=s?~ayNQHWJi$+YuakcJ+8*jXTF-0qrTj#srMim{H*{mfp~hi9sTBR= zXlVU!IXtm%ho^E3lU~J+so1WRIds-5=g<(`;w;1g2RqP(OO|QLT1>FUv*Tl9)+Ms= z>1;dBOL2$CzX03jElZmj7V7epo?bme*Hc7O?60`N4_2rQx$KHp$0iNQn}?1ID0&(d zum-`P3pZCdGVu;>Lqt(ShJQozzSd8IMj^lms_5_o*x5<$Y83 zsVk(KEs_gd7zY4zObGb$9Z7t^%XH21JL{9-+IJ-dDEJ8;crwZgm(nq;&#Tt|DKZn2 zHp!jd-w7y`oYh*g&+MYS>&^n$-@09g6wXnp*c@w*L-}qAiZS2Z;B$^9aEL4 zZAX*6=ww?YW+P`ZO78Bq<2y~RwgO+mu6P7i*pB8+jZRX43n|Q$to>@}uIG+*zsEB3 zjThvD9UX}$s}ZAM0=!&AOp%ZAqGA(=wVE2gK@dT!GkPDv-pGlwOVZ#AkRX5PE!rOr z6+z}gL(M{#Q<*cV2sbS?Wx3~-RYRgbu6lxHaElyi7TEm?eYG|YR%mL}__{3pJKvzwNmFOM%MOcpc!jy25=Nzfz4OT?n%~z~lo0vR(^FHRinZNf zpWW12^Ocud61%21(+!mqX(QkJ;bME(>sGfD!4Qcyy|AF13cf(<9k*Jul{UB=8si-U z;2xaysUueYc{i)~{&Xqs4-%4E%Rw0ytn4Lz6A+);y@ zvP0&3m1bEgPxxE=bC={!)v`{ZNB=+kF%_J8z6lieE`rhYA8XWnDSa;=**JG&IPBiN zz$${cv;dAc8`Q7V`9`&F=Xh85>liPD@Z zL7ALpat7evAO)ozMK+-v^S2O!JA760_;39l3QuMgATr@9ftio##&ymOI&=x)1GKxv z8zxVw0o1w0eV+JC##Xi!-qL!Ci7CUW8DIBHJz`iZ)b*8E-)e(7(0f6@C(ZGtiBFkm zT6G`3`&y2xAKp&2DQ==n9EHo33LKS_V0+xYIS33P7rsVr_do7T>t||8+=9qad-r1k zAfkT(bWo1G2y~5=EV6PvhHJN#Csd%8)(02)MG|GWyv-o$LJeGvKSxbG`CIXUNa(MV zj$i(iNQ!Z6j3!aZR9|*WU>wdQp}yB8MR9j0y7K394k5)TRK1Vz30y}}jXK#m+enSt zV?rtVIt{7~eMBSeZxAwsV~^*Ot;@i1$4#*RP`A-B-(u%xG`;59I^r+Dw-InnW2$(p z8n?5$I5#>~l(M+9y8I@|Y8CCp2@3-mqb;%k2;0%8WyU-MF;>?Q%(seN0ycF_z{N_y zuwg-_4XVd!Ax`QaI&@tyZ%)Y1uN|PLeH;Rif8g;GdT4j_9Tc$t3(%u9{(eeGPl9ns z)sJ65@ioMVq4Ef+6JE)Y*Y-5~`wVh@sv38^D8cehQYb!`hE*6HIo|TrK*OLtcDlyM z0sGqCn)hu#;dT;Zh)3@W9#F8j!w5vx5=)(%db$rz`A_3GSjkB?W!qGqaaGIr}m z3;dBj<{e;njiH#lpoXNSy}g%!wIMr~a7ozP`jZfw!5wfuM2-fU$bLlpC{u1utIfis#MZPaMOlrnCjc z_fpTK^QPBJp=GEsY5r<$Ua40QmSeO!TPiNJKFUZ=bv-=chZzcFuVyUxKR%8{Qt2F< z?g^4`Fr$gl*=r+2#Oe&jj( zwYZ@E@?n(teW3leT*}3WWG%5Vy8@4}7+z}}5_9rv{VT^z!B#tnG6wq$)6YohW~1t0CiHbF^Z0uS|w-2t$8N4bB+g zii4hapYfB`k;1aoVEL^AhPAYO-l6r^HvNU1WFi#@zhS zsG^sm2DMGWIOVEt2ET}w0n*WTD5W-?6mjw$?t1TistS#IofBBWWO;0f_;B)jnu}4J zf(qXNQnc8Z4&P6?dKTxe?-Ahaj^bg%u zxF(vd71w2Zd3&0`B@%+#SB!rF0gJ_x6(`R190LVk)SJ+aQpkPK!zkkpK%nr>^{F>` z&F?(*=M@^<+k)*g6sEV+s0#J6*g7>qS7pV5skKE@7yB+ngc;654n3a~f%T*D^O8Kv zt$1wmBYj;1>ptsG#L`Byj{57>b(R#dRdlqdA9GSs&cZ}zFHEqF)ElLosjj-zIfj{Z z(*CGBc^ZIR@A1>OebTLyhR!4-8hFt;vTT9E>v}qvtldDfob;`^n9TOSfDQ25q0;`I<(C!ygS+B0Qu-Bqm--#mnr2uzf>99aA;nE^g9VvM- zHQHSo^m{esE8dKXe7PRI^rEF}d#Xh_3&DiI;C20~;s~pK&*>FvDkXaz_lM}op+)^< zO@&1{7l07F(17qyI));FECzlaU<((`L;gA2AaEq&QuvyaHNyB)mxq#ViLup|r>3zo zMn_`qm*srqWRCFqX7T~y^?Tf;x%N{5OKLTf8uk^(Zg+JHahxYkRYlsn+r`i3^+(bfJPwZk?x*|>|9?Q=+8w^A%6zIV1 zO%_Ka$fI~Mgil+>OulW;{{eKOwieO-oIJM~pUYZlCV6%eTPdeg$xz>HoDwJBjfj(Z zg>*O-{ygXlOzUcX{aTlJ>2)BT*GAPH!&=JuPgd~17jC31(dj_`Y8P*etdMsrSndVQJ*b@(_b zPGK38W8tnHL~cUz8?rcfbF>R#X0$9_d(6_h`blu>!^M3vc5*J7lyHpgB(_{5jLbm$ zO5W3iu(Q9=)YNFHL>SF{m!(Lq%%?00$^{YW9M z>H2~%zD-p%s?70vy9eMlZrw2qB|`N>+?&5TTlmxBxKIX)%zePY&x^Lj(L*1OaF2Jo z*F`I}X~{l(uPy0I7n+7VHiF|m6+cx)Oruk5s0;g@Hdfd{HLA?IHRE;om7%)3vro)5 z*|{78u0k0;ttXuK_8O_YO3jtC_<{2?Vn^nJ!5vN)VLVxnJuLdo@lzzaObum+FOACm zJ!r;^C~E4;&wC4{%L8T)iV;E|uL>v(O&Rku&X zJ0IDFW&4ftQ#`J9@=cs>fCMpdm?ZkiGvRFHD3m)fr)meg4fTv=H;oDU2E*PS8+6gW z{M0iRZGQpq)SN}b?8d14*(w^x z3s?%B82R`2-@e_>`bMv}wYSBMb#0RbY4|LTSga(*r4J&{&3@h2Wqa8Y0!c?tZ&ogY z#~~{Db>Due$MCA3<~p_fGVFeVk$^g=(WS{Fe&Tn!*xtgk<>0vWY5R5CT+&Sdc-EpW zO0^F1i_31N#D(SKNWG&N$`mIBC{|Q|LmZT zRCFR(c$_cF&>z50{LC)Zf6*Uwwm)9Fue7QYmomu7N3;+B3v_H813?qtf9zBP<|YlW>P@`|2<8=IV5=B|L| zI@3i+EF%R|wZ50l-o4ml&}&W1FR4}##AA-;5#X-J4P8>Hh6D@;lvGlaYbr#m)3ye~ zFo;f&$p?Y^L!hetI1U-?W5Fr)FOaJgS>7MZ!hd>WCo1v8!n=?Kre2CreC6oR(Td}6 zr|);Q4*8zwC+hR=!Pu4@F)=5eO42AIt%&s}PSy|MZTpe(v&*8?k)K#2vOq3OiYP^w zN1b8F3fs*m#v9Hcjb5XoSNzue~e7%ZYZ}blYMv!DyzW$d!dh z1ZgSTFd=`!#BB_>y2PLA6YeF8ZdVVLJQ*;N&^x8=5!Io~VZ5i_Q1J#V^b8v3V> z_pQ+i&HF?2GyY5@yca1JD@t6C!Lj!gU(VKm+oqdkn$h@yV#yxe^ zQ*=4d;uBpEfhiks<@muMcMZc;lsXaLMd!X+Aq!%a2$0n-W$^tW&Cz{@vt{mXn!>Q6 zV2)#+s%*-xQiOqvu0De)Q_?_1=kf<=2qJ_xUdl+2poKAflREyxtE(5O~RAlqtX|F&rGP@geZTBd~HTGcO zns$fq&XJWe{7(Jyv6Y~I_HzU~`M3}Zqq+Mm%*2kGQSrRtY+ys~FCdeydHosy#@cxr z?=@8vuxULEx=)`TF-|fHZ#m~YFteZb&g8(39`SL?0!YjXp&Uzuu>3B)GMUv_T(m#K zv}v&@n;P4C@BS@ow*);Vk9pe3+N{oCRZ?o@hB(f>3n5@gCD(7{e^k$yW+br^I}M|1 z+hq`92sf_n+AQ@L?7v=n9LY_WYUrTI;NK@rxsQ!3^rSagmh%}Pd1dsGfdVK$at!VJqvm|}ROP3vTXQEy*hJg?wM!l{pR*yfbjSzR>`~j~|m!ZV5@)e@u zA9twQB3oR3m*#|Rp-W&RdE|!4l0_hiAY++qvR2CvdYIF3w0C~yJ+U+T^(TRw2ZNrt z#g6`hHdE6P8S}AS9+Cu>xm~nbmxp@Z_TYvKDa%g@rv8j2Iyi3fdWTQ;3;2p`^j83*FkztgRof(A&?uN$bpzSAf$C;8abi4NZKzA4Mgo3>^t zYws|byP6nk-$E?i<2PDaf3r8wsG?2hi2JE`Qe6zg#z2`|qOIerB$Q>JX%Hap)jE8emy z+<+6>$7bSRj&PkR&oPL7g_oQ|A4!4Jw`1D*9IN9MaRzRR zSw(}*dt0GWb9QDLaRp}?Rjvi2%&FH=AtD@fex#xFX9+)})MQo5mKRqj$hbBjq>au) z2Er^rEHD@ezH6dUlA%4FTC)eH;~o{VA|_?It=XH1p2VMNE<7cPy$&ei16%t1EyNhyJfc>bbT^Jko zfegP{U5+q_H>U3VRGfHhdS%S{yr%p?%%o)eYxy2e`Rrw7z7wP+)5i%cjQAOR1~;6m z%Ghjyy!)onm|~CP;bO~oOq)1x`A4F=owU0{yeU${vb=;=d|ZI&Q$={sIlvMw6&IkF zsD)~nyfhQUQV|6&Wh?>(5~CJww_j3w*TES585n9VOApg72~|!0A-g>cLIvNSi;MnU z?ecGe{NF_RzgjkoQ7$5+LBI3CO0N=b2IKa&uEE`iu5tD6Ko&AIrs;LN@v)_ z&1_8}Qdk9v$91}Wm9a0!qv^PCoGr0Z&S!Xc`p@}CS1^DD;feKuu*)?hx2o(K+ZIecFJ|&jbiQmEkaBp|Y z%+!est5bD;#-VZ~Obrn|Y)EZAF*iGAdm7JeU2xVE8T^Q_H^vi@IzXojrgjve!PW2M zg<3<-x8pu7q@4$XW;MM^U^5W)Q>*F9OnZl)$REY*3t?&HI`3ly9jdf#clm|nm@CA3HawNkL?m!?HHgu=H!)Q`A`D`d|Ll7J?SP zlz@cY7r>@1{LY&qp62FwkMy-H_Fh~G0GpUD?_QSWUYxK+-nDARz0=o%#Xjs{m?<&% za}J#0dEUTY;`kyX<9)dFLQ)SbI%;A+c*u z3+Xkm`NG812T8wJ1vh6bX3w6*DiH0Zb}U9&X2yj=b?+oEl8z$dWfkkx>0dyD0L7^J z_cd>pf#!#j@2p$b2#Hvq4zZcwS}|TXLUHf$doe#aYUu9ysDJE`iM=89gTJ6c6AHUk z2nZpeaTg@8^tsq;O)q!HroMe|$~14)tb15w(YVD#QLvLCuuvP#e< zu}`TbxkUG8?=ehag!s&f96LKaExKO+sFJhotAe!!zSu)VJZic;1Izc*OJdzs#D~bG z_b<1jod*R+ApVeM3!bcCfDocVUBH7-pes|o(Z8>Fq)Zy)hPTt?NTkZN-GSnmL%+^a zJkt@Gqpw8|i;7Mdi0ws7yoW9cngT;^tZ%cmi zH{ZpfPgR&SPS9y_%^YGHu4nJR4KNfObMF#gE7Xj^xIA+e&XDzca+1R)r=ZM+7paTc zln*UN!US)88XE!Gg@YDC2k^uvkgia*g5``+(@n9RJlEXz7NJ5gRH59+xI#S4tfqs#A`jmJo@_?DWpI3EYTExI^ht} zys?MfRflJS_<5u}{W0Qnz5fEN1QCA$v*rF zYZD>Hp^QTy>Q?!m=ft6|NXb}vsOq}t=#P$7=us8A)Jue1qE5D^*{$TQ{Z&Zlly2^*hb#Ws{MSQr*S^J&;Bjmf%ils|H_CQbZMLBDAI|jZ|jJuTVwX zq9L03vL6e0){*lJ2~g^4jBX^^UoGqabD%%EQ1AR74EpMmHe^p%Z0?*ge)!_*hT7VQ*CVW>KzzF3F1fH2Ts^%e zGjy6`_~U|h+AAHk>CU<-oSEn6>OTCk#906(=K4S%&=h&-2vJi}$)_=umxuuM^h4MT zi1@0zP;BX&vt>Fntf#~p%oj#>nKl{m243%`;DYm}^*Dmv$HjmOtzFBzpLHjV1;1P2 zEA==Yb!q~G@~Koki~ODIOPTEHlk!44$S&G>W8su|{Z)q@ug*|EBj1b$zsR}rSs?H_ zY^00>2Fw!q3P#%z$Z)lfnCFN55r9nU1oUU))M6_2-y4TkWY{#A4&)Aq( z;&=0vop@b3uZ*jO=a#uSK#UIfmBvOqv0dUa!9rqKsy?>+bDctcbunC4bDX2~$EWpbu+&|R1ea>1iB3}|#U_8r_QSy6Q7I`6t3B)~ad!**VEhl@Wx=}efIs+ZG|x}kyPJE+me z8>x6FX5XKG<-oLx5&E&$DQq$?s)h%A>AO9oy|@z%K9J9r!;`Ma&RjXrdQa^WYds&* z`Z0>q0@mFCQY)!8mSJs;(bYu{;ZdN(ho%WIA(jmd`aY#PGYpOB%;*S;Y_zbRU=*7w z2qXfxWSOS7z@o3-i37+H-`DjfOrIhj8`eshR?|{Hw6=eb)e`obbNO|ku2kXR!ZOSG zb%gshVChrsMS}3*E#d9!2p8!m#Dlcrr$diQG#}j0FBEqZgT#XtHm^LnF(A4O2KEE@A&OZpziu+ z_F(L~W|^UhCFEA@+bK8*+IAMGmaUgpGZR&znRQJ1B>$^HuVFDZNiW5dbN0M)%X?4$ z?s&0ad_>i6JmN99bRUG;4zY6uanWiqboYMb3$me5ce1+Q71)2GK6_dGrLLsvScbhp zhQV7G9fhV>Fa1mRblw`@#QkfXd=2iMQKFEYl;+s57}lcaQmPOCmO4O^hAe={CdLq; z^snbW3f=<4*<1LiQt4+P5RI4@Joay-dZZRi$z(ukfA@s<0E#gxT`@y%Q zM9%>Glz$~QXPNKEKGZ{Kx_Nylyo%U1%iATM%428M`2aXVW2aN%^##@DLG^TDJ5?Oq z1BePSV!HX8cLDl19|?u-3Eb~>lc--#ZVCsB1l#Ldo&&J<>?$h9m7r#kk-r|U*p2K{ zbnQr1XIVQ>N|0cZn!l9b+8@bavihufp|Ua0)dG2){%gGpm?qQ&e36GEV)r<~hPwip z6|*DFX534l`aC-(??t=ay}A_Tdzhu zv*LQPW*z3~>k7)D76jnvej|q4FYpb$V>;;hyun)!1(eVJ>BGoiONo_Tp)0t+!C+w- zk9sa>p&l)Ab8_~K8jaPu2{VlH_Yk^@Ij-bY$yJ5odV{igUw7zdn%+l`U`pMHCE1To z_+~6F6CUCpfQNjuZ`rG2#=HgOI(pZJ~fR-GFY-hd`=J z_*l2Hl2B#JrqzWR8GpkAnVR&9zF1)Asy9`DE+AXXFa-NhnNe5e)n*};OX z+epw`jve1=D~+>}+R_$_cMzsQ^KQpy5q=WpkG!vwYceG+Vi_m7Sz&aCGjF4ffKU`q z5#NvvMQhoeG5N>`w=>y*Lps;b#vJi&mgqh;Tt4@?jzYrd@@SPrZW5{-N@AV!U4SOz1S%PF z#pmPCOzTjgZ%R$j!SCho#_{z4 z^*tHFt4hV~b2IGby&l1WCnn4JYP+t>DrRxunKVCIO^pYh^Ki~%P}zs;Sv5u=_lJ$RbzM~9v~hosRAme-N4s#B9QDK%`|^N zGj%`0j7hs$#rWb=_hebVd=4UVAF5Z1*Y!+^E?IiP5GVW!4=QF(8UHE3s{&h{U~OsX zPsY5IgUGv-VzGERmdnaqr%yGpUxugMFdj>}-)0(xMcPeQ?>9@_&kTxOp8C_Vd+u3f z8wR8u_lg_4B!;M=uTuHD@IDWdq~DeX0Ub@RfYY`dlrBD2mf!AtF3WB}DDiB565bG{ z%Hy7regLKWRrz4O7FE?kJq1ae-Td+5=Mv;dDqb+2VTJ?26Tua;_JP65a%L~d{pUo+ zMz{5mj^LDvo2j3{Y7QJ+hCuOIGKQD@*4k&TD|^K4 z*y-gm7=r#hmk=CvIXe<>;R{E3lwOdzHxclle+-|k;}UqOYc$XOweBUO^Y+*mOa^3O z!UZnmgMPg;GA+@m87}xMy-T- zj`-El$XA9@cE?->}5Y=RHUY%BTh>o z%R2625l=5IXn(T06ew1dV;gjEG~BCEB&szwl(M?M?%Z5eL{`#{9r5q?r+VpZx7e29 z-1gJ5U0K*Cv>CyNHuz8+KG-j7ZE!HUGmborGrmK^_nt9VE4*t=1j0WRQ$w}VHpeiK zG`vkbps64e+IhToucMSBW|%S(J(uBYl;1Yd<|JGFw2;L4IT_VL*b=&qD|B7i-J?@C zZ64=n5MB_HydLJ}<|lSlMFqjkZ|B}txFCvLsY#=BZxn_TH_^wjC|cS-vqm3XnX%x+ zn<@s1&&4#L*Y9qq-g=5mBTiw3H_#$nd&jR+kIKGwUx_CJi+J33(C+>MsQX(SxeSN? z0>1js#Jkf=#Gn3T_%t?^}#fzFu)Q)>0W^0Pg_d9ZT4Cqj#C+V6}-Ej!k zc_1#O8kh80G3@dA@ug{OW93pa{M{eh#OfFTnm-Qk26g6l(^cAkDxUNarnf%jYY z_@}xRPCLyBW(OK+i9vQ2N#}SsnbQwG6=lZ5NZoPG<2yY;YuBHVIdaZ z>zuuxT0JG(qr+6zZw`*a6@Q(6QU-}1^ol<~0n|MeprY(zBYU5(u1=ZS9_poVEyW`H zlzW|$uob^CW$N<4gZ0W8qU6M*bsi2pYI{ePro0$d81PkL-!l(XRF(xW5!L;R5TY}j zA*%(PzD#F$nEerb?*j;bF7{NqI7CYr2&LF!#LqEPxvsKpj$jE>up(E~&d2*8$I&ki z7tHh*%yE+l#P$*Mk(h0%o@_H#hmP3`&BUtRqy9;gv#ThwL-;OhxQEP(?N)t|5NW04 z*(VVV-_AjbS2>H{*UnJCvxBqa1qZQ1^F>F#W_^LLXe@)Cbe4P>^Tzr3ouW^cG^P{v zPgFjC-~sGHb0S-{((pcA3nB#8ZLZAfKA7O9 z$sy=NlRw8{0ws^{bQ4q$Fv(ms`DNRTLg*s-JFf%;$Fz~c)Ev75$C{)EzL--|uhyq; z3W?8rANvApN4tPF88^}-J0XFyC~d*oo`wYtA#2+C-0@`IF-j*6(zHjTNf z#oG@Uyy8cwlwkL9^{4hvS32yjH5u_5#Y%CyFC@O%4+`J8OHxZ8IUO5^^u$S28CKJw zX&vM*LY?j{!S5Pu5pcOse!^m8cp#! zWW@Qd1>u;9@dG{EYyG@StCc;345iZT9`4Z9WNY)gVe=EAt-pW>TlPs%hV*9*LynKH zdcP(ENx{KaWeYV57>#z@XQb>%`hj20XjgYh^XIh5dXBZG^jFAbbU zzOZ7q_1)Qa6=sn(Yuhp&&*&cgRng^5(ik>59-F{WWn4EtG+{A|mX{6(!-g4sT(tV; zJn8rgX*DcJNf(ESw_4s*BK;e(eWTT8T#8%-5$i$83SBtA`peXlim`TCJO5WZU-=bf z6z)3;f|N+t5W=Xm42m=;H4NQIqcjLIbclqahy%#b2ty7%AW~9Fr_@l=H9<(HFya}{ zIqRHzzuiCJe%Nd6wcl@hKl@$J{?$3`GN=kwU@<(7sAfcXq;OMI7rUJ_d1W&PjNNXD z{M=TrmUTJ|n}%PqnC^-_tFEoDj|JJ)It+1tLHF8OMsAP&f*Unv3Vv+S>dJy{^jA$ETkaoD4u-r?Av`z%o5DjrTuqMquM9?{W*x**aB^ZVx18iQ=9RkQxXPG5j5S zNt2Ir1_Uw%)AZWj>i9{7d8RDZn9mp|&Jx~=ELQLxj3q}#wu78=gYj!WG(U% zeMqr88qsEo7U{}-(*WzQX#84teXbpz`+-~XCw7@faZA|%1G?<`U}CWA6sV9724#WL zfgi!sB*pDF_qbT=e*D6Zx0=u3?6>{;1`=iURq+0Vl zoHumectt&7|9#zLg`b-ZbQQK4jBk1AOwH^jS3M~pmu#$`q!D-?{{Drh3A&w45FDj9 z#Tx^hR&`hvp&73o#6q)zeOI98z9TEPFC9}f6pEZcJHj$N$$dD6%G(#O<9c&&LqTIH za+%$+sSYuDg>|;!_>iA`@c755DsbJTc!hxS)8^SMCv!Z_(nknOgVP#UijK`=;8(*# zHE-V?Iwi>Hv77UeQ{j=koCxPgSCjuTwWCCTLL+~o<@y%?j?wjFmWS2r#%R5=7VcgW zBgPrc%p3A!qHc~3d>cQp1+zn&pgs9iaoKzLs4#rLHU0H&N^nWo8u3CtX+0s;|hni2@X#^i!IT0723?&W01qb z@n2%Kb82<9F%asoNlIn3CHmGi7ROK-1^zr9x2?O)B>7yeyhTD_&c`h+@lLgB;#4g`7 zZKEt^`Q>Dh)TyMELqoh_t-)<#Zk4sFTK{PC%B+l?^^{+fp;Frq3H^Pqwi8N}?n!x^ z(hA!DwkwK!Rj;gb7HuP3tD^3Dx(1tjjXYC;+3CwMmv=+mn~^33g06krUZ_}IM9(ia zz|}xTQtM@9U;_cUL~s?&Gx{D^csN6+y^XGu$wRSWZtLXk)F3!y|BfcF?J@S*7kpie z(1W2aos!=_u>|`yo|egWR_3sUV)(ts7G@2GO;_#k%AJ{C)5fk}>U;*Swz#KjaGa~&DDvXLSnWul`=O)*K9Du8&EJi3g_G_lhiiVEBGRKm~iThXV^+)la! zGEmwe!z-^Ci87=tnk&4_JuT{n)e=GwA@=x!)a_B1AJ%KRvSrp?hmYNLKIUU3R}u^w z*Y>xy%4Equ!idUi7Gfm>j`CJ_WlkQTgZd(iUNW6I?3H^XyFy)$q*{*1HPRIhG&G4D zhxj#UQ#1>BS~!{_WR zSx(klZ?f@sQ}si*u*!QpuMdeL-`GPQNPVhq6;-s%RJX?ACmlUMTeRI?a}y1Dz3EXh zMx-oppJtf16-_nt{M`Vr_mMG`;am0>;K`_ZG)CkqSRd=gS%Q*!M>5y$D*DFvj$;}+ z4l@TTrGH_}Al2^%`RmHdWm~N}0va+oH%!uM@N^t4QJ*Bt4Xds5@74Su8F9+Be~7xQj?cM9v(b`^$$-s`I@8Weo#Cd zaNz(l^cukC&DlI9f7woGUpcD zX5X+*A!_>e`&kd*Gku2Rz)RkUDl3`{l^v-E5c(6p(%ywYg%g&h;Ai!$Y)sbBZz3_$ zueLkInMH{a#sXdW@*#mvQ@BZLHN+jKQB$Rl0hjPvIe6*_Ki@%5CvM?bL%X zL#&$_S7`9nj>M1g>j2@i%}`t;PIHY#taYJ_l_{8seI?~XhB4k{N6EO8DgKYI&Ble+ z%ZWueuB*}5UF-&O`r?^MO@mdb7s&DJn_fN@O8F->SHZ8xm+FN}_O>i-dW*B;0&v(w zlfK z(N?JwcVd+nwTxZWH&v<>Xb-}CZ496@=!{WJh-3#;Je#FuHf&2}I|`)1^Gum9ssP{4 z!O>f+SjP2GsFdsdF#|CAw6+Y}=tT&S$G+But{r+#b&LN{vdkE}VS(%Kqm_fbPH-@u zbBns9a%3orDFlBRn4`@OC0PSVf`-ME)+yX{BO^Zk{W{dG%5Ki~OLuKg?oPa7SJUC) z4SmJ45e`z~jKIB;IVjzMUc-ymZitG+r0Az3cY#R7Fj5Dh6Tj)~x=6nuxNx14+=cf( zqq6u}QAc%cgAzioUwy79q@pt+u<2892hwPW!jpj5xqo;Ci<7#zJ zq-(v$%2_(aP3#f$9KetFW6M|KYzdlm6XCTWi6OuB{h?b1rV;jfo$<1idsRHaPEK0J zZz?fnc8VP)-hWIpCL$x$(kPuZCR2iyYU>XcA#cARgM5b_hB1^4yj5ri>!5l%@eYDC zqq~?4#iBW&RyQFBbTt3UiL98``j@nc@J=OToLoq_)m!$$is^7W(#88`uYT{jr=Nfqm9`x?>(9) zs9inyFCcMr!PT{_rl@hkKh7c|Q4#0Lr zwv<$y&uCxtcCJgu`yBb^9S-a5QEMUj&*?VJ{vgxnV78SUeCnCb>uQWVSOW#(#;{3eKu2h0TSdzlMLC zKR@A_lwSaW({p1Wocnd=?(se4mKKXavAe(O?><*mdcNWlL;u}(n^;a|lI=g}r78ZQ zsx)~^$xF+!|2^fL|DQ**mOWf_@1KPIoH$k{U|R2KVsbIh8E0?ap!{*+ZGE2kL2Y!q zR{nMrfK!F?6PVqNixh1U?M{vQ2O`-^D7A-bWe#1EC`419bW$S=sQt$w{?C9uq9GBC zWK@NB9~7=efi053$t--+R8>T!dL*QI+`3)9F~Ce#Mc+EaUukj?BSCHtPY7x9zpc9{ z+VPEtWo_`m%foWl%(yJ9&D<`{*gHPjNh^`m`fMaW(m8|y9@)RPk$EnbubL%DsA7pO zJClY?kp)j(8h^$uU%3$$;(uCM91EWoQwug4AY9wgBG91RPtt;v1M~_R;AVZdG>&m0 zSTkqT-mXb?+AyY=?Ro)@l7^4y8x<~|0u`511kcKE1sB*;NEY7bt&&=MCc%1I(p=d? zr-w|^*qxPTrM&eHMI+)l%*7jR5WhoH!WLSqCnNt3guHln+-(!>r0hp!e9`xqC^DRN zoBlnO&6gmo1rvS*C0povPzWQINhOF4Y|HE#lgsox=1ESDV*{(4>eNjXfag^ZRW|64 zSJuXhwbrEcX>B)jc8ik~OKgoGg9+C5fS}5wXbo)G{n=0W5}AdwEORq9iK^)E=8%AO zwG|E#%>&n6g?CQE0}GSQlYN!s?GKfJH`HE79#uV>c+jeBqMM{~fBY4Nx)0~O*G_NE z<-$4!?&sX|raag^Hy?XiGb>eF(P+2qqfgz$tac#q8-5e_ZJ)A4@tu3?wJD!K7GI(k z_{qVH?a#&w-NI^sFP^#gH&LisFE_5{^V3PY1cD6)1-V(pnlUIR#?3!(jXj}n`YjNcK?XfPUtI%94|=G|MkDOoFI-Gx-C!(u)#&kv7Sfu*Tqp(AfI=0(8>GGWumb??5`w z^9=?{Xjv6(N|P0DdzD<|y4@qz+4aWD1;iR|+p0{RDn{9L{sCM+Mj+%Y_S_;{x8u#N zjOtu@i}KExxVKzCqKUaLM9B^9;~g%=bQ+&!jOkNZhSTclR(dkwH0E0$4MR^Ag?YEb z`4St1P9JS{y<*uo5ARsuoK;8ctZwd=2n;&Ua1cq4CI0|R@rG)f$*V;k~wC@$@n^kR^RF9({kltuD(NCk5Ht#()i$LW! z@>CLh%*-DDmy*C3P{^Me`$%0BJjB$?zXQ4Ugy#)U{?`S_3N9~G_Ceak-GP4oR8i^% za#}+5)3fOp5KBz98|KU+#ZsaS{UBJWVOddcalt7vbw_ZZF&13+MgDM_xc?+^VTX8IlffVOe`ZToh>cJm#yPSWZX#{qgKdyQ-G#LWrwwhTF#5UjrD$l%)QoQsD6f|n{ohD(`?@?zOD@Ln|Dz2OhH=a8BgdXB!2cIO8+5hN%qhO}agW^6x9_FRU8AM@ zz@7$&7e!VZfhXGnGg=it#_VM;nlUK%?~vh(I#eqi|GE_4!>gJ#~?HtXX3^l1RC zgHqwi$l27#5&XJTfAG00k=T0eo@2_64`=GT66=1Z-V@_c{z`Ic0qU&fh+LP3yU4mR zH%o;?kc+8@$8=nSP*4wGyYJs0YvVkuLe5>Xpygd8L38etD;W*4%>=V3ByWs=dG1$H z9N%k_P-CXuS|__GoaJvxnxbL=Z@j#+^?$F{xHJL~y}mrJ9NNlRXL)K$a*l$y9bW0w zIGKboAB107Y|0jCe;D8+dWxuG@6{u?%U`bA~ho80E!wOF20$WGyDF z45DFXE=r~uudK6JxnCLn(dV^1^3c{4^?X*}pqr@CY^tsUAR|MGd4;Cyuqa5L`oAbK zR2QSPPc|BRMDf2a#eX~)B7zn1pUJ60fcaReRXDGfM3^u&W32VRiQpA5G&X=9#jcbL z82VaLT-VTOQ1cj=8{kJr-0UH(uc5@$Frn#~GZ(FoH8kof3jvIjI83SZ>+O{H4PR3k z!(=b(Fw5u0)v9r);2?MXUs;WNlLX>r0sToDO5>7qf?oS8J&}wT)AYkIwtr=#b&S`f z(8uU3;D}V5wBaq>sd)*Vfw(77pzPhZhc_S_Hb}v4=RLofdz8?u$i2y*GVHyTzsAE? z*s~-Ac0)*KbZ8UDjyk4(<#3)Y-pjwphHwNAl$rMaK=&zIj)cFhXWU+*1M@2X-=8a{4N#qayRfR)fiiV*9|j!_B5(%5PI7@hNv9FV!)Ix*k>hS#icr z;Hb(T)&0DBGR>}SQw)x44;kmt`~ z=4MIJCy10aH}!X*Vf)Ck#}ug7m*&bSV`t!WrHB%tgR@r9Y9L;H7{=xD{pD(_B;0WL zJj=NMGiG)RAIvvaC&@zb$*(KmU{9&BD2~g<=b@X?8i+U&0q&h@eL<1NT-nU=7x2vJ zG9cJmiDRFcz&|Y5&+!8;q1fai<@A!Oa@c&hwH_Xdi}|CB4zU%2LBOzn@2!BPAFHJD zc{ke5hd8;kLMm-mwiCDV>qh;W^^YG)y#8~-mHrpdmLP>v7inl*(56&LYiH&&pa1|u zj7TAzn*WRnLT)6cI6qeJh}73Y7bB=G|E0wU{hu**!jDK`WC>|QNgw|I_v^yG`Byfp zDl021E3?vjE2X^mqP!@HA}NZZr|7-+-h1!8_uhMZ&Dpp-VlWtgMBJau?4D*OgnREF zf5eG%zVACHe*516z)z%qM)@Xo%YXNipC~$c)zbWvpZwqSb@u~W5i`gj3S&4^xvykL z@(cbc?8W|RONG5Md&s^<;@tl``A>)I4(<>|MA%K*=~M5KO@^QRyyC3K;hyFmj+6FKlu-k*SCq^npA(oJ>>_pi96=RXTxE*OH-0z&<*sr92Stp0~ zE$&Eq-q84#4lSD(`F(T0Nmjj$11UUAHjzGM{jesj?KVT-a=VbPU>t0k^$T8}pV@({ zwom$t7OOJ!D&n|@`Jd=xh&pBp9B6mMnP}r-6&Aw4v(VH!!ZM194?Nw4!zk-7EqU0m z$vmsIkP9Shp_;lvZ;;)sqLz|G*nGLD2P*&Rr_H~A zuOT{m2eBqj+Dt$>ruCALAv*{(sg1W-{-ZENj|;F38zG&(V>{lNiP{ouLyyeoSkYku{f0V-Spp!!LWR(a>7cg7kpZJ@% zS0336-o7?IHnYPJbOlQcHsa*>g9e4{LKD%R+y9F)L>RLlB?dYvL`x2~dajVKw~AK zC9rlEMVNoMH`v^QYi`Z}HORO^k&8G{0qa#hGa^ohgB*T^$-I|&Z@xd~<7LPV7)neu zZqh(mTcHywtEY_hXTiT}zCF!{;?&!ScV4xJ1k1F?}{W6AcQ#Thk{ zUAAc*_2ZIbg(fjp3^u2s$$WH9{w40tB-zl^x z1G%~YJ%5NCqIL3?iXofEWz9hYt?zy;h|3m{3c8b3xSo=URZ8-iOp1b)+g+#T=}E09 zhis5Iws0#;R#vDP>SB-Wkn@rZ913@BDHkD!tBrp+Monf5&0r|gqV96p28~fCE>65Tle8A1Z3^65?cqRLi3#eU=(Oxb zRvWO=)#7d!_0gLhws$x3nr)06v8jL^<8`a+<}(931}eSFiuQl}yOAvCa> za1N(B7;M%;VLznJA@V+_PekCkR3jYA>QQDkS}gjx-so3##l_--RT&{B5JQ6FHjHe^ z%up12iqxt$UWf|JpX7g1$IMsWJL~)Id)2pYj7NJzUeZ#aQ%+>e4nqio*wqV43{iF& z01is*O`Qy361vM3v_^~QQ>L7HAqFYolp-I}k6q$jt5xe5bC$?S^j)iJUj`p&J z7P5}@GaGpP%rcWRm<0rD9;e)UrW#Dd0BwyRG@e^E$x^5y%aK((=QOKYiBl$fS(YJ9 zL3TOUPR0J|qv61Z+u2D_l2UDN-`mr_n?_c5=YkGot7z8RLx}sfPKIEXmzC)<*QgCr zq+N9ZAd{R!%%66p)jt-3oIM%Pe*zM}h6&QrMGYRLu=uS)Q^S3WL`pHs&^J<9mT#WCWpKEh?(E8jon9(`t zI!XrWNo2_3#Oq+!Wzo4QG8Z?0)~o}8UN)aY&Jzy@nfNolY=xlhnf{_qN~~MBYJpW~ zR+ZVsG#P~sglE}U!IO2)4J5OWt&Q2JDL{kg`#I6o;+RW2WEXWkBV&RvJE22xsYcS? zM9!t}JJV8EN@H?9cz5EZ{YIwWN}Shfa`b?M?Lb!Q&Uzg)37ZL7L1a_b!PHHE4q*YL zb3D>aq1g)9v2kVRBTE8kk5vX@GZyzWFKcm$i%VevCM=pM8MLgkjLV#0W^LetiW10O zPsuKp4isJNe2acM2wem2>CEjM^2&ZEuFW-vDgPb}^)sAOgz$cM@^hWn5G z9rO|soFs=lt`e2msx2I`rHmo^bDGW(EzUjoWqce1scPcyoGP=7;&@9rOrp-Nn7I(h z(kVL->q*j{J$kn2C}bTR+l`GKNBFcEi=|2ch;>84sw_u_T99HNJXXn`z> zWD{qi)eJzLsDE@lEh+aDrs^qaELf3{3YAiLXcbu`UR9emh~&#O1>vr>86m6v9S4$0 ziK6Ht1_&?NqJ}B$ zz+@GoEeko1uePN`ZP$daHhAhqx)B9wfYu>BBxvjgeOGe2ZF;l6A^qObv-uI&MJUABo`s*#pU zOt#@bM!w=Nn3Py9QLDHR(BH`gPUJW*wT(ltObW?~krgu!cOmpy7omkRJyI~Aa~=8( zwibG_&VSRI5WP_BZR!X%_c)f{e!cLsqbtF#rlM#=@ypq?i0MS14#y*Pu_>FDp~)Xs zT-<3{RtUI?om(dD8%M{so7Ej3Sz zVX=bfKbEB@#_Xt^G%61J>gm~J*q%4Nx{y)SVL;8MmnjsqIu~Fejp%m*|cb ztn6QDu)sx$70#3$TG%VnT3Lc)cEufq?vmMWG8$L5jcaCJ zNi7UnA8n5M><_ImJ}VWGi&eJM>F-P?zrRp%Yoqe!kpJtk$NsX)+ul$Y2UAUpX)c{b zRXg-RR#4-$DFQjkDyBHThhT^T3Yf^<%&u4Nz9tnRd%l0UY z=E6!fbS3r1`-6F7CxhVJS+@|MlcVRH=+M+HTN)kU+Fq;W1V&VL5rORBy+W83;5+C& z&{orwjKC~pwS-g@R|*}GrBj8zXwxQ34{d&+ffoXThEk@WY+B=lmJ15YXW3Xt4`DQA zYKZeCdl9C=dQWQhwWGah!Aq4fRx=&k!lZvsW4eH8SOkf zHUuUd2vaT_cLXPE2E901h}&1m@Sr(FmO$z73S@9FMR>_*AS0VP_Uio3sWOWX8G)@{ z=_s79f;nVOBI}bik8=yxAvaCgytoecaKDqRw4SFcH!h{`1y26l0&Rz~WJr4xDgwI~ zu1pBjr!sDT(;X48Tpl!EXg`ts;b8Qo?%-d~#{WF&>L)YRp)gVo)!`l9&KpxR`_G5a zDGM_&+Kg0`an*QGhG^F})HOn^;3Q=dE~67_fZ~`SJ0BK3+T217MpP*X$r{PV$!h)) zHjqt?vw`&|%~x82aYZ1DEv~V!fZ^nm?9N^d#hRpT$xei{R9r|R%Mz?|vn1qrPB)?a z<6h(gm^a5t9FFwl`cD;xuM|2=rF=72esenDf9|pScr4f5+!78w`7;TD{Rv^aXF@1` zs7440K)IokX`KvFWCr4EdOh6Xz$DvCX1BIIYaVAR7yf-oR!&{ojH5S4c7J>WdF$E}nHL4Q`Ci_P-<9JaVBdXr=b~O#JVv?)}qz zg@d^>3p#UW6Wj-~<9DAiN7YRmee6>kCeFQBlD#rO4@1}}>VXdDO+_%YVAanMotCg# ztA`sp+o)ATPbUN@>dU3sqKkf}0p@g?4LsXeRsj<439qEo&WplDn6iZNVk=uV4N?Yj znVeQT$Pjib*#vV9=?UK-?Mm^PD34z%4W7w9HtPNVtabm>W?PWCD;6f|#)It^TATJK z5Sl8rGQ^pr#pgcX>STy4o$SyhO+La>SsP_q1kw-Gcv8jp$J{*I z8|$)O6+53zYON!UH~z=b%)8JV0mGFrn9%$3F>Dg6*vm{%)X7Q7GKu@QOhd zj)n1%Y1QG*h7)OFHq#C&!=F`bY5S-7O}pkbO)M2U&Usj2MG-r3np{j++kIN)pRjZLm{Al=n)Nq1nAi1NKSKlpZ*uY)NBL^!CJ;^+7??IpG6g zAJ*9Y%|QBb=u3w20%KRoWT@k^K}&virgTPnfWaB8>scq%FE|Y{&x78xE{g}72M?M< z6ikzey{t&v=imLOjj4sCDqyeb;j$|&9%N~RiWYU9wlY-LP8^Ndl0XPeL@=E){h%fZ z>pCvW;a3VEve4%UDRevA2^TVU6ZI#W$8NG*W>p{S)%?jmz+y{W2R68CD&o8CyJWwEF8P`Yo|%j1O)K3J%|4MPR6&}b@l?}*Q0 zF6Lziq6h1+H!XqDy=osGm?1crG)J3NH$rGlRQIMXHe`uHmg{92j9N=7EABa*w7s6o zsI-I1rpD^JFyXMkB|yZlY|6sVboy5PK+~5(BZQj}J+e(K=5Vq?CdkmK6(bJB$RF~* zg&`B^fepT{eKF6vTtCgZ`RQ`)W0=T>vD$^mM^nRtI}Aa%vniTWcC8{%0phf8pKVsx zAv)b^wZgN)R8b^!#-2r|g1vkCr>PPV3UpsiJFS|*SFQ}Eh5K6dm9TojuGDfUw1i7L zYTaSIq(wZ^TN_F$#%Q4eGt|kPsalQ4nWC?tE8nZ~g?n%Glah14Zc4cUeZDY}50lx$ zp?AmnMwoMj)JqB_V#S4vg`lYUAqKt` z34x3F6UJK)U1g?nQKVnhbt#1ump8N*da#NhoGOEz+~)0{G?tuWHX1<7v(XH(sA8dkCXZFjfftX-%H?qch{X>kt`%xn#m!g~U=? zFl#*wVc~cn{iAU@+(`*lIVaI7^pR{wPTuHT4gqBxi1xrLmN4FIkXT>|D*;X&SmtvK zQIJ{N36~!zP-Lv*+{KkuC=G0gsSaw7vC^U0UDzYP= z%R2hUu9Q1469Thk&=J=k{c?GFY=iJC%a0q1V3 zxt_(GR%m5gaUey8(VxWF;!S9Pc1C&>fdej!S`LCN{m3TFsI2xQ6cm~zV?IWN$`;qB z&_&vDxg&er(}}ozD|8^2ZRq)a(iLe>8DhDXq|C#y>7`pw)Pt1cziCXq2s808R}Zs! z9iA?Wn`AEJqzMWZoighd_GJ%RODwLC-1lN3svd@L`ghPYBBX~JsjO;pEfttxg-6@J zx^@yyN;XqEkZ=}4MZnSVUoEw?O2+BER=-hVWZqEc7K%lomlTuYtip-NCZ!HBa-Nm; zS1HJ3`5hA!{$jbHz5In!W2ogxZ}n!}fWbgmX@;t>&bY+g$6Ax;ddZMRe%Drv zoHj|n9+V**TlCZ?IvK^fo5d67Xl?9SlxV>x6ct7AWSN1RIDP4nP?HqmEu*3=x*Qv2 z2^q~0R()*jG40?2KsZxb`qjQZo4TD#FKTjXnJ=`Qd&(ZP#QN91bRSK+Q+W1|qZQ6D zmJExH8;w3QRV_OdB6((wxmKF9L0d_ z34f6xQu{JNb*?}&tR_8S4q@d`ov&DL=#d!K9`bn=Oow1N5(9&Uh@q~~BVioKXzIY& zaYvsi^04wjYqcR}=f&EHN~4p6#-%)E^DU6naqJ4TDY%tFLrnG+46r& zl4rSxS6{&0#5vc8q_{XM^1eh*_<(84yXNv>m zWC-p~_T`=zMYW8j0ZSfqpzw_F9$*1}CR5G%$v*7GxzaqQ1o)xmiI$UP6&gx5%-Vxlg`Lc3J+n~egUR)7K7_w3K z@@Z3$YiHoY_%olw_)C~8fzg7&*&s3AR3}Y1y9O4yUwXWv8!6gmFGc?rN#CnFhlxV*K z`draSdte75t{|_7K$+9dg`+oH6tOvn12n<^T8q1LsqgK+P}_uS-@vdNOc%g<{dlRz z_+azSN*!OULp#KQ5Q>(I=NZOQN{|oS@8Yv|hkI_Xus$Y3>RILr`Gz2q)izvC*OEjS z4@6NqSzPeYl!Jy`Cd~LdTS3y{a1^pK6J{G~2F5^0NEw)fbqlpn+ZA=a5EE+h z;0rZ%<{$Jbo7u=`Hi3|@2fc8CMrtpI$gfl6<}Qp2S|~GvmQrjSar!K5um|cEGLR(+ zbcVVW`+5}L{4U#xR9WHB?gob1**NE>{4&kGQwSR&6!Ayl4f<50x$LUzSe6iE9202r z5;m6Q4b~B2kZtjAg5*HYA&l)%hCj?LLh>kf5eA-gvLXk%3`R5qYw4lVm)!>?vUA)w z-$Olmm<|FsA+*bGp`$1$wezyze*aDFNEqw~PolFqjhz>1X6{P%FZ8l2e{eeA z@f+y!gW*`1&RR%$+K^qjd+9q%JjLbMG7pncNYTYT|HWe7kCHzTLT$#%GE>hy=%1el0fN%tKa znPGAWr;jYvU-iZu5k~N^yRi3=Qm-EP$<_)A%1RfRb7cS`Mr$v&6$%W;5Ee03Q<+xh zw7XDE)iRS+EKY{0iv)>Y@{&X&n7GH1v-4#;_;;UZaICOyvee z|0u-wRr|x`5O(H!Y&+m01T7FERRLcC?Dk)9LG7_h5=8@A_p|6!piL)w6#62Qf6hpC zk;yhzu=v3j zNlW2yY|iC+}C!co|Cs_kFvE1H?vJgGfU z%a&oV-kF$qiLkp z6tQ!MEelYqL8UmBond8ZZIxy?Iu!%itC=Y{I7vW+DbDrEmNB$wW+O^Fmtt-kmUpf; zm5Hv5r9w!ypnR*#w>D^!=4}Me& zh87KI8D|QefD9!vwy+@PQY5zv*E3t!YCESP(JBpfE}a6hl+`?Khn6;)mn>tjg;Q3{ zg>p< zSW73CmNHdVry$a&>S{VX3WD^^#o{Pk=ae~4*kj6%qzBscv^AwL*S7^Dy?Ls-j zDQHV0nhn@V$tFTO!O_*?jqgFHM{7u9fY}oNcfSh!_)lr~f4*3E4d%RIIdv@f=Awl@ zB!^&tgqMda7ALru(3rjOSv{vtix!#F)o>9KRG9K;Ij6qpO~??LHnXW;##KEPsxV7v zvlizfc0_ggA=}C^gcEfNXfDh`&0^Uo3yLDk$!bNRVp8&OdtvH8^XQIjKrxQ^0AJc* z=e2~RRdL^c>hbG+=L7 zM^i0N0~*PR%(cB4_QC4`w?EqMwS!K3m`Yxbu^Vq}-92MS(he>8SnZ&2Vl##%IwtXa zc?YT(Vl>icNFrihg=8C6wk_{OMUrU2B&$AIMd7$^l^Eh$UwLYrRZZ4S9Drz071aU@ zRz)GfZDQxB$RX^w$Sbs#V+gv4JLbb?c($U`dF&Yb#0Zj8pDaVzAj$&DX&E&bKXCJ6 zL%`jCE6m0eS~~}OeV#xmiFc@z=qKy4DE zW@zI`5xy^2Du$T%4jkdmue?bPYVDjlW#_D32K?w-X)07F9O1aE;?f3ehpd;`M1-&- zNRrioT+bXtsKQaX5t=8fnH@6I1D7a)G z?imiOK9X_SNBfb+#N}h1K@ZDc1{UADQ2gM-x$ILgb{FQ$pv|ko*^TVH^Y!QoB2;onbgkYV zM5SG!zIyb9vqAP1GmjojYu$yD)s|l57d`&x_{>g9n_;N5?-S|$hxpjNcB`!IrQRTi z`uLD0`+NB>PE2Q>h3*S59s@Hejn7?&X7IE+yCba&bP6cdM}ZHmo-yQdz0k$f4$h}6 zWpzeTPgL}grnX^*sF4@4>~VSTN|pDa^Re}s%P@2o2Et&aVm|s-Yen7e zQiSs!jV4b^aMqAQo9fZGd)~bPmG$4sy zcxHe+NLO+6P*wtAUBPjNt>3h<(FzJW5Y6K-#F~WA)YBnCSthr_PSBYw^qB(2vJ${e zCL=79OU;<&I9J=SowL&+pXq{|Vi#bszc=7{eM)$rk3;0CH+wTaf+=^Hj3Flt=M(PL zC#Nt2v7)SnE{6~rV%cOZ?e#E(?N^wQWmS_xM|E;cg=YC1l@Q{x>)2$gSPDT-dpK_M z;4{5?@(7n~xn|r~4&t0BP}Fk3!mAt69xdi5<+!a3i21!ZYO$G((+E}{g-XXxAN?;> z1j;e=0Ky5yj>41^8Z)d9*EwCSi-?{}4a=~(ROkIJbYF&rRG3UQw#F3MU7Mb!*DtED zuDQmZWr$SxtTKdyvf^TIwf3tKBixsq5tB_AQ6fu9=z5`!(i%VuN^TuY8z=_iw1cxp zr~*RtbNwhT(h)j}<1p7oCPs*9c5TgZN#%e=o^C_Mt>9)|8j(^yuY@AHONg%-|8CrMaJ<4lEB!(nm=>p1cm zPwuF50%^cSooWWUiF%NVD;Ga5>a65Y?ZkexW3l@ZvC%#egUXnYR4j~G?dR$@b`yT4 z^J1~0DAHJ+7S30uL9#37sb{o1QhW%eymLs0n<@4n{1JUFNJmD&F>7p0!^h?jY6*@) z+TfB8V4$wz-nFjO#HF0L3fJp(F~|GzPMF&+!$2ym*Fslf=X00l_U@g?a-P?U1)C?? z&m6DzKyEdMC_-hKp3$(n|H!W_iku(`HRF~0cJE0N<^f9^gNfrCmr}T~Xi8xNkMG)3 zoHxK)h3lEyg)4QaC~|_zHsdl9ClCtn30Kl+kCvP)**F2Bw2|Fti4&(DW;@4CLL<3= zTJ|!&@*ej9MT9f^7sabq$v8xE zIh`f}mU0*sZDoa>TN2UkO@-W)6{O;VaR^t)G!Lz%TiN+?I)cHbK;a0<_OInC4uShp zhA4U<&1g2@fMmN#c1Z1K)3U{rn}#LxtGbsKNc3`D)GzX=lfi;V zmpe0a=F(y-?%$6+_I2E~KMiC)hUrLHDuDSCSS;UatuMT9_v&sD>sb!%A@@0AY?_Oc3i|6E6-Y=&`Vt?d2nTm)#DCB%#+2>FLfuzESARh z1iP2tJrjH7yVlS%h8|CtOoGJ%SSo?p=CSmkvh4geRVhS%R~rmo4a7gHi{v*;(r~ojNUqAQyEtxY>c&iydThVU<#=nw(OyUn%`$)xWke zYdK<9%{_!Tw-=qDP~%ywV@qsCOC8R8WRtd>ZJ2#X}0Q)Zi~1ywto%m7L`nFL^T#78hSNBs6pe`hcDh@T?SaWxxK0x!Fw zbmgW@*{-EDIebFhj;JG+kiUh-myR7Ffirory`kR2u|d_2F7fC7SQc;%CfqFy8A>rO zl*4@Gc11>x^W*VX*P+m?i1u(%pwBX;iH`H+D^0P=5TrFLMYJPy2d7)Ymf9#PlCO{n zIQkWuSa!$oeyO+hzooneR;@P0mv8ZxmcDY1#g(OHHu|_1?SY*ary~lDAT7xviakX`8j~t(vBCawNod$eYW!?g z%vxv7dTDO{om2UjPfiuv!H_3(1#XSz!g?MomzZm!`x~lvctx)I-P(Dnh*s>-TFM+P z}SLbXCW0P@`2U}$Y;a}`DZHc@wKYZm*&Ct&9e02%((e-zxB$T z=77hs-~FLI^5Rn6Wf%*FDRQ-M1Z-xR2jhC8Q@Sb}cW%DIiUh3(8;4dko#TDM~52ehhqI=00}Ab(w%SX#>gyJYg4PN@n9V)8lAkpY;#qR%NM+dNx%NooKoBfu!hDK( zITMWK&>T6D9?_Ovvr7_M0curAd*XPnjn3y~Vc-van+}HwnLa6C&3YNtR48V$9u7L9 z4BuA!pmXp?r6wg%RzP>3r!FW$nP z2mDwN-do^Tmt=04_alZiw7>B?u(NdR?UV5 z%>(Gwd4oNG$aN?J!7@s)mMdt3nL(y`GJ%(^xlyOt4mm$i zOK@C#r4wRT247C;*bd2O#bZv?XT7f0{8G<`=9AG_*r+cK?nLLBgXx7$giUf^oP;G=PW-!+akRG^#L~#@d zL(U-Tz#7Iso94rT<`bs*2yJ&L8B+Q$tpCOzVIN&NU!D_!Y^^7dfs(TY= zBt_Yvl@Au&+C+rEsA>RB)hcVu;y?@qdOURJw27WU*=#`i6dppPZWpFsj0Nq7>KBb8 z*<@iz$;;qGfHPHz;xb0hQr_3Na!uGHQSfUbITOT}_=#$;aVWKLqu zGn;1ryA!3sYrV;HwSns+8B4>Zv)wU^<;ep{K@CwaIy)L$l2c~a@Ps}2!+KJz?|K-* z;t9P#y5nj9tw>lcCol{LUHv0bDKt3&Kxq_4S8Fp{1jXZJbDa#NFp>!q_9i<(jF&awSlE&#BAhbL z(UL=YV_y`xxtY7FI@}xz{>8_0KX(A%gvC!^fMa;&|NLgae|WDYsbHNsf)1te&=YJVk4($iqKl0s<$zG7Xor08FoJUj_QO_vTUQpAAP_i#+wQr zn}}$Uz|BhmXc-pCd^z;6EfrECV-Blm*cDsgad$_E>kZ9%kM^L5HI-DF*03=GiH=K| z$s&z15Jnr*({1fXf}OMe;+xTrT^9f2?b^RPH}aix_dBr1&koOZs}=X|~2xyI1*mHww{Js)>fl>I4 z)=(b0T#+`I6hD`jS#j@X?8m{dxS4RnD0O=%@Y8jg8gU1oU2pwS- z=0-%ul4C)_;kYo+(n8yqx=XQcQEXDOswX!nD}`8b z(NO@#8`JJxpD)c{aB|Q4ckh(_@>t8yZ%%%At^1DidQ(a1|MHu*yZ+GIY^e7$c4V&P zMD=<&S6)4vd-tQs8aIGMSPg^aFqn@s_qw)(x%4;Vb&bMvh!knB(yShaAg6Hx2Q7bT zqSP5SI*KrvSp2*HG9)%s+%B>zf|{gNP0Q%y@k~r?SQaV9qJ45}2A2QY41*BCDYM3F zC&K;0rWcuG*DyD@gN2TLIXSxrun^L+?7fFus|?}NqE4U-g^K1}b*;?WO+T~DW*aCfa@GcJ zM2wBFc-SV7wcmL>g)pLu6$N5Tn3pgY(K3vBpM4X6FagTEO-E5AXO>0uGg=~)2A1S> zTy{D%1RSXl&{m~WYbsaT(XVJNy^VqxL;gl$F5MhU2p>-j+iWQu_468b@P~k`#((j4 z+vlfNN@AeHXS@FSX!O%IKfmN}-mUXL53Bw#9|mj5u$jHx<ws-v+HP7PhA>!t$9HP!6gNirnnDHc(R z^PUGiM9xkJ)q(X4myy`q%iXfZhJYOBpfax~htP74?VomNvB9u+2_`-d1%tkGBQDG* z-LRQR4Vy?xSZ!)Gbau>Fl#E_?sQBdOQs~W%$}{WbPnSz_ySzPv-}p^U%r{_&v6NMF z(J<{cQ|HrFl(lIjUEzwH!b!+#&NJ5UQ^)Q&PqB)AAf8ar)4ixcoT6X@B)Uu~QMMJi zQn5+KQu4cO$$<{lDuqJGwa(!rKxm;*5$Gsvg>xY1%QAyZO=X!DLB^#QS$W2hlNwKY z5N0`=%J4Wo-b4=O;le_vC$s5cv#Fu${XNhhxmD)Al$N%h{bZ}@?pEpP`HX<&?3~o2 ze`<_=50-*qDGX-Gg^W*z6TcqprYmwbh3a*q)hdhD1{gMWhFo}LP-a1(r2*Y4j1xMM zgAr?k44txaf<=ieQOF7g?S-4Nd`N{#f9*sur&S+L1=uNb&JlWpb1V+T`hgP*>T`tv z3FF9(&XoWhc<3FlC^{PkGku*CdT$j>cPwmTsy(M?o(x$vOZ*mS|>mV;&hs%?k>^vFR~Rw1ZDxJyrmi7QEy^q}g_ z9o6(|C^{C!nI1mN7{U(9;$GXiB5!C3p!O{lsePr?ZbVpd*@={azPgRZks^oOW!Rc} z?do9g^NFOWrJ52`Z{2K;-AwA|vngLJ=A7EBN^f?3n&I+u*m8pHY%t}(@}o4T4`$~k zb`Mz5Su2VT7L9vT)58!>Q#nsrtue^%T#?4{ibVsfZHoLLTMVEhWJy3_Dq9@0RX+Z% z)pg2h;i^}*a^-RkYmcIsq*vMsDQeaKoGRg0cD`)4ieSmg63*vrGmdX`6MmqFJuIJh zUOPdZNz5RRdqXsn|H}JwVk0rVH`8}_F{=dP* zEz?8@Y@`ANw1*y>=xt<91yaxJ7tL3svRY+nd(=M$3w^7BLXRvl48GD7f0_P$;`gG9TD3l?gZ`I2ZEl&`{EV$V@nnW+Lprt!) z$$8QuNxMe^EDTvK3lBf>O@Ey4RD$1PVa8HX#zNXBOPP)X{uc&Zo>hAN+|YXhrpfC+ z{Q%-R!oKJ!jUcZb*8U|@gLFSqOjWipAqY0C_%kuu70ovUF@3jp>5B9Bg=4X{Gg*@5W3*bkc_xv!Mo z+8D7i#7&mw5FChOi|pVscU2zsB-;sMn*0mvBRR3hk9P#RuNMc;RTM3jW-X`u^JvJC zny05~AHKEK_ZiIIhplihc#cOMtEvtIL)ZQjf>eNHq9zQD#VV@|;e0KN3gVTzn7!Tx zCrM|nC4DqxwdC&2E`&h!@wqLE*#u&tOI3%quxW;aX}$_;VN0HFUWSv4fd1~IuILJ zPVp_~B-K8F|i7W$d& zK{1J1qd$kdn)`tmqL5fTx-U-UJMYhC^C^vxPQ-A{xTh0wQ54EKjiNBOsLGff;}P!M z1o3dBR&Fg2F^E^>Xohgs?C)CCvRid>kK&KEr*LG~PAs6&Fmkq3>?O%PIjHoMkn9x+ z*w3=)>=PN6+=qyJAq}t}?N`zU76(#NuV0x+_E{>69Zd`vii=*Yh%CSNarmXbhDBRg zbb#d-u;JAi@?m>!@(w*%U1l?z0twKh0bSFC1wojN&L#*j|KCMB?XUfj7PtmNe!9^@f}Y|A4~Kqxbd6( z&_BV(30U!j#rxy}lhC`jH@2sD7=pb~2C~{j-6C`m>lup~dKkh+P6lhCGzw9U?iPkt zfn#h>CoGd;Jtud$eYrvDWU06cHJc(vxD{i}4MasM6__?&mfgqpeXLq9i@b6~^ zzlSY1n14+EZ}L9g-4eGm9db(v#Td&yZA4@TMQN}$tuh2vLFRg^AraxZT6GE9Ag0h0sh-%#c2uYl zvQaBw+TUrkwCan~=46ReK?R7}1-%wtbmDsWM$uqZN4QzgulP6|>Ju$hgcM~H0`)eP z3C_dZ(5$KWnW`+^gdV0Ep_L*VWyKroBo6uh6^xCwN7EimQ;Qe*wV%ff0037m^bufIjfNnI)OzGhbq>AT0nF2qSK)a z;mRJa2w|r$%mCEGlmL=IZNDL$$Fv;^jik-!C^RQiIm1wr|7WL*!?W*SUoS~oF7#{m z_s+dxoAv0u*_soucnMbROv5k7bDpFH-`Tyu1iR9zr!45I7#)rw+8(XSq@teTNX1S} zzf@DfW_Lj_p|dyx*eoP;5Nig7m#pAnSxpDE>Ju)ru~T3>p)+EmE`%@bK^Ah-tu`Uc zD2J}&LO^$?o3KwV^Ro`Y9<*&}{l)?s=g40APJSUTp^A*Ycwwa`V{3eP^@7yE*Fi$VATWQ7r6`^nbVuvG;lJhcLt{0@U&;q&WIrR*7jxR8RRGj2PZ=LPd<=t@v7ce*T64UgruK8KM>?Onc&ss^04T^=N)k$ ztd3uXsdKRCu|48a7j=JOwsk*4Xe`*&K{d{**u66QhcHAD7$JFBcnM1jszxmC73or; zqlj-=Y&gMVt>uQ6%~3`zN=xC6TDJ(RP+ADFQN+n|=5Y;ZZ?ftO9|xoDgmRu`oq~Y~ z=(R1&9UYizXb%+e$UU|b4gj=>!ZS6OOZa-lY%kwRk&?#&~r^JWILt zaZl=J8(r_h$Z;?PZMFH-rFxq!YkGWD0UcK>pp?B<(fCTH|4T3gP2?bgwkjY?f+svO zh_jVxn=Fc4Y}6{t23T?55{G6qNvp4F*DDGkiWs4ngqe_P3Ke5n|7biH8rDk|Xqqe; zhR#bSF(z`XX>Db82ac%poWy8zFHVh%BkqXqB21&Rrp-_k$lp?D$o-^?XS(Bqr;~#^ zJfPp z{L0<{pzT4M6S0j9>oP{MdkO8->Iy5p+O2FQpmL?;1c)q|2<1&dY@uQ5Kv>8&rjurtk=g?db;Ia`PD%3 zH>UPK8U`=Ipnq3{9XTGndlbuZKZ&xsv+9<84SuW~!uf?xQifM_+5Qq)oOxuTPIf1o zWTyyOdsy`)<7zupWHz?^U>!$umm*^zm{@qx#x&P+(L$fda)=_d>M6*IUQTFf)KI+9 za@J$`yR3p&Y_)_#{uJg7qmg~A8G9U=1dIHwPDDCIAOEg5{-v=oxjW`^qxZL?iEppA z{+!$gV(jy&33c1r#v2J)P|3tj_Pf};*Mk zKH=1GpWBVFVHO-Q-(d)Utr`*%F-;$xf%ed=Ey*VGH#6X86LbD(Z>-N;adhGN_p2P= z8A|wIv-@|j^k}KB9L&&~lL81^=p*Lu~$D{GbVhD;2{;Mbz=W zjzSZQVA_K)zjOH3f?LKbn*FpEDi~tf#PF6wwl>pJ4zOpDxwNCb`U_djRsUKhTP-J8 z@8RS0sW)go!I%=N(_?hP+6-+b>L6Raur#yuxwEjQ2YmN{K`v?A-dNmuQs}Eb0p|K# zujkv}pUID%$#lrKeYe>D&l?p#gMsg0!+xyLsk@QfH8s8afB~EoJ2lQ%R^76%!QmJp zgD)yHotxFA zhHwO>A?IR`RHmF!m_n&#byf%tqCo5G>zljv44azNQmV)^?9kLyIwP6!LPelp(pF-! z+Dtfc>|9aNu@hI9wbU(iMp{dd?G$8MPf}wj8(ENPqtE_=uZ+X%XmBs>Gi6Xg@OQij zf2Yba^p)Q|RqXI+EGuri=vwT>3+*pY%ohCG*!2fkx;v8dAV2KU&QUBpkcFKf71fmp zZKguq4`&G4ftGPWLR%62S|iw0gRzkb7>ifh75O0RS(YEP7IG~W6&E)JoG+CCIy*MQ z=wzcJJm^3z^3ZHnm~@Rr1ZDSi(pp!r{wJS>XQMf~V$^8#wM?cVrbwWS5*8X1+~{pW zm7SIPd{f@7^KBvSGZonzwU26jA9i|wJD&e582T8%vnBcA!eTm@$u9J9vKSYny4t-~ z+gN{I799X%fbL+aiEg5sSc5D-O3rdnU$E`j`3OVKQUb?iQKG=NHp#H_Vn5S0B6^w5 zl$$cG%eCI1%7jx;2gz#AWSPm?z+RQ8Uxf5$Yy;EQ_=O(_lrJ*kryVEjRopUc`x{!W37 zA+yY7e-1&Y2wg4HAViuaxcYO5EZFE)?N-)7GUH^x74io?E1W8}r^>+%$AOrOHz(2< zNV+N&;+w_*yW-lgU}c9^WPF8%G77P-pdzJaqg4fAFCk&OLi2?7vwUN72%03T4>ESjDAO-YU{wVT^ zRqSdxPgMy=M`9z6WjxX93vG!X*yCwbiKv=tW2cn{{Ds0)F=e5VTB#+?V7(=?%KmcR zqr1at*B27*6garf-{ApKCQ-}E0jey8 z-(@<-o%WU~rDWU5;%YHiG_NPYovonz==E^>Snak$cTdht<#@li%FRFUA4&i8~)dkkELQB{xzzRcH zUvqu2=~cFgt3YJ(rVT0wSp~3UIF^!jKP>2FNPB^2a3(WD=yVEh)>`DD3@gNV+L$X> z6h~drtE@cZDAW~fw}@A|xZ;{onsGBCS6;0$Zv_#i0`jD2&U-B7Wd0Wy5xah1=S4n~ z#9%pmZyu;Bd33ceA!ItwX58;+x!<{w=yU6>-IA*InRcuL(Sz$;$bVLe4@y5SXX0>dha4N#D-#)>6gacG3+FDY z>jaFiLMZ9%xU|LsPT_W3QX)2c;i5 zkI6n6j3o>w|Ey{%EY#^S*40`xv(m_3WRC1r3mFzptRCYo*e46VeU*vk5FeY6)wHBN zBSS1J@b&(@O2_LZE>1I<7g}DNt_?WS;CE)L={#&ahSf)dQD^!`2X`5QnVEXtVxjyo zUq1pv6qkQlt?d-)g-dFjp;}n5LPZ-ZgpKV`)*D9G>MYb<@e|oOABVg`F}jS=pJAloN(rdR4h)m>)8KF!{}6ODB--SL&$?Vg8bf5*?3U@*^p(gIgV zAxsEr$ZFXulmoPoBLMB0I#3u#ML4K7b7o*TgnXl8Y0Cdn?DySyu3w#M99YCHiO4`AwgTk@5~joIBQ3)P4G%N@LCg-O5qSX$~~2o*MV zCfWi(@c_?Ph>;)A5S9~KhR|>#2V{Zd8L|sm^)g0Q78-Y6hQy8aiflVqjB|>J0U#1W z-WV#(emJi^CNKmhqp%ENdzQI~eJLs11`)>DMt@W|kn@+so6>_b6@SP7 zIg^B6+2P2zVCqh*b-mjbY-4T=9FBBIz5S>5$Xn};AH&)sShDL5Jv}jpkIBLzw26@_ zqZTu0l8Q5W7(z8b>m6=}9E@0Pli^QIXjYTh$jRhNC>695tJ*B{mv%>CpR62G31laT zdr`#DP529!W--`wXb$~sHsCTFYa5FRG>^hXs3Wujq?wRiLZI8Z8F7^i-AV^S^3a^d z_MqhwjqJ|R-klt>)gRvO;o28>Wx2ve3Ptx>W4am-H;>#xJ@9Z*6s7hqd!y z^4@5%EzQE`z0=F-DSj*w-0u($mewmSs|+DMvX}K+?~&0M79tpF);=rQO~-jgnKA6R zRI~LkglmKQ%IJCs`zc;o^l-AxYOw538=aI;)U`FCOv1GEqp5>6gET`XuzaKG8okYW zgDSUGv~UJc5kaVs|1C#*SF&6>!aRGEUo4hf><@Zc`SSb0Icjf-Bgho=iMGL83u(=*TQ@>d?4}Hj`I6c-13k-I2N?ipZg{E39U9_lR35nz4 z5nJ*cabRy7-EzA_K=5!A02btG6lIy`72UD%D z*dmbSfXs*3A%|MFTSOA)TbZd^;A#belYhD@paIpYK6cCMH<#Ijn4xKh?GU>{Z_u0O zVSB8+`N_@EVtaFM;zCML-h)q@LoOM+PQjuLY(6*iJ7>NO-eCy2e39IbBz!{&9&Q@yAmrOpgA)v8^FLul&?_0Vd`rwm~&RG6{n3dxCK za-5Al_N8Y=tXf+=(S(GdW^nzpVzh5YJ8!<0MS*sRyL0rWx=Ec68x4Ui0iJ_N57!#J zR&wJKFaJfW)2Z#A3$ShjYp$>zS^ez#^v*jJcBNdHQE@Kp^c6_kQ)itygd-n2d7&dv zMYwAFpfY^u_H0U#b;4PwXDpm4Cy-PNsoo2_B8S2$*|=1OjuNU2+me1pifRiLE#O#7 zglN#_VVXmz5O7DIxzG#G-rz0iTymhsP(PrC(q=d`c8H(JzdKi*G=vU?`*b8-gC=L_ zFE73D*Dd~6Haf4v+(THn3y|3!@@RaLT)c?w@!nk;tbmQhUVjee@4(Dy*bHb5wqNKYFHFXz2mtnkU!u?M`epU5AAyFmncs z-u)2|CdX!X4`*>M-J2$J$BQ`63lH1qVTcyr3QSlTEto8!YRPxpc=S&leMg z&ZeqM(33at@}s14U(8ougvsmVd0DXbe52E~GA@1RMqHz53w?`@SU4R$qqF$df{8+kTE(?Ndt^~m{EoJ18z@-KX$?n9 zc1QYIKiXt?U=yZVgD}SuhFci2l;SuX8#7((0nJX(oiq^fX~vmPMl(;r&~=zS4~ve* zey{47teuBB5Sq}#-)uP0vHHWkXP#Ata4^zChC{pZKsiJa26{eDU9}5Q#Yv-{`C=Os zA;kf1wr4U^uD0O@V#CS0MJ9EqFT(sIoC3!IZb!ru%`;k`Abe%R3Dt!3#vQ-mvKG4@ zqu?e#!hGrT>gSK<%WR-0b+b00-RJ#$$6G@Qk2brm!_+aDI&12GSR4|)Q)SU-I$}g* z2eK5Kcz0Q4h<=D5@3oPZoodwIv#_O5kkGT#3@x5Gug|oBmK5v z$*jDre>a<9KB4FlW;v^JXte=Xhj2Ki3W{EmsfmoJ$a6NLGDoqj)3Tb@;xu~*ku8I} zFxSzE3ysI5r>_09!=Zohz86alSu1jDc=U9&HfAa3n5outvG{h;<3HxyJ-6C$5tc5& z+7s9an#gv^OHSX(A*`eH(m-)}-a#26b02DwPKf`&W>`P47pMu*gArvbE@6xhP?Bn{ zO_WW9^vNbGiXJ4Y5HVZ^V0&g0g;khRHfk?}zyN6zDK`sQg?YFTv)tB+kevc=?{z$| z(G)!x8@O7NzE*0pUj1~n_~A&@mj!k==8J7%`MaH~vqHAIUCMkS$)3u}N*FIIRvnZf z+Im!`LwYn11IG5LCkz})kT6;eLwe{bH)Z0jX0pt)*c+YKmSNw4CdF8+E9j)O4rd9* z+Q99?$tPFW=@coM16k4vyHaSD)uD;@t?WJt&4T%@k;XPR+s(Sf zor@N@T!63#oi!2yRLCoCP=!CK>XEKsb0BXt(r!2}z*PCv&=j*$^wdCjwnO&(WG zQ}KRGWfi~`sY9lIgpR^H>UOxyAdneDC$I~G@tx{ zHPRs_!dXkFgCDq>5W%Myh24d^Na!U-ZY)>DvrJ$Uh(bOOF`Aq&gC?%z@wKe zRn}@x=0Lc^L`Kkd^`-4P=hY&=f!K!?o~IJN|9-jqK1^MKXiyu8X#NrLB3{kjDw#jIOb$th#v;_?MMV(BzaXB2Y3HlK6R>=v2V_|BN(U>%* z@z%30;7hBHrnD~Rwybk1^&I6E|Zbr~4v8#{fU z%+|(iw*;=1-7&YiPUl`7h;qrg^vzh_O<1vqtp{KVn9Dj^RZJe~fQPeaibn3KHAoRS z>kK)l%PibA!WtpTK`NQOf@D`Y*m1dvoT~v8XZ;ivm#l1%xl#|=^i*yNlejq1LWR>; z7U(i{z!IEEDLi3h(_yP4ot2e#M(mDzHW>D;plCY9SyRrS@FS%$55V^FK&_|Ebb*_( z#cr$W?pB5ET>P=&{NVCum#Vz)z|?Ip+5z~_lw2;a%-ny#*J{+b23$#IG5&|-5Jly~ z76W>!PxP1K;yfAnWc4mBY=k)hLntJ_8s&Jl0elX%u z?vqPfqxP_I2Ow~v@^Wic9Yl^mb=ZD9 zlY73aF=~e)EYGQt)Y~$KQ)$>YFRM9(^MW1_aJz7p2|Lu%U6CJIHR9qVlMQ4A>nv62 zDLFH!V4cD(+(Z=Eq9!RSTWw}|%XCoVLG4k61+H1)|C!WpS;#!3UZ)n0o= zBg>@?V`FN@oii}iXlM%GuD)mN$lYp;>Gl8RLbglsjf-_LH!QbOZQfd_I$azYutN{B zUZ-%U){bSWp7>3$L)4!jtuo(^usIxt17`BIPJ7~XAQ_d6Fr#*xCfg z(pD>bsaTk450pc2GFH=w0v~MP)l#H@$l+4F9?S{b5IYY|JldgEr*WR)ED;s}7!Gy_ zHrQMggkLp1Y$=W+N`=V`n})rMM7Wu%^C5l3GsjF~27ROhz<5!6xXW_YOX!I;wfUJE zyE!Z0D*df!r@q+Yj+m{(dsB{EcMTkvVu!` z3Tm+}$!FQcj%cuOrrH#tGh1Ra98^)dlm202x~|#xxv4SD)EK&5b#}Y6c&n#krT9fd z=Q_Tn>Xl0IEHZ5EK4CeW%MNF3HdBL55{^4 zo6*vd%XnPH1u$J-|Ki?eM>>pU8ylPq4MAI-m7C>3B~Guy@LgE!ZF0KT8-Es-UA9`T zHbxPua98+Z5K$Qql!`50`mw4kb$&Qd?A5Aibt_c}ndDPES=AE6grbtx&I@C3h!f|E z1jTIY`vfr2gr-xyAY2!&$^Cax{!w4XvdjLYmeT zth=ZpSlZ}hh@#lgN|aW2wW>xtv?SaeKpaS_h2pKJ+Ch)7vPbrkNsFFQXd9Uhu?2|& z=&XlXlVraiR6%HanV*ULOHUChFLzKROriE!oNwl@X`n4xvB0^Lh%MK-UfXKOGPMLj zyFH9HZnqR~wdZcO#g7Dkwch3dbNxdReyxe*>i6J=$kW3u`MYTZfk#N9wFGG(G#-C{ z#UHEdkb??5&Ptd)6*{dwXQUGWin3BWf0n2$Q1s7H%_U(!2hBoM>?!5gZWU6cm<8D+ z+sbAJnW?Ox2nCUL&Y35RINHOqf&xZc>5+40Z3E8d#)_j2l}^xl8`ek3(|fnta-cJB zFyiV|!&xwlO_oNMJiH91u*K$=Jy{QoYveKlyb_+Bpw@VyUf_IRZL-P`bxExiPD}5~ z8=-{Ir#7LBWuDc}P_{0V1yu+Xox>?eO9YsEmNTo_2kqYyRLQ+x9Dvx`M(qk=9MMbc zg|w`xY#=zlu~j!q4=xL-NlVemY8l-Hp+z>4i)Q-Ayf3abrbB}#^w^NoBQV~y*;=^K zSG-spF`DoPSSW?*u5QoAD=pruO)qMKFRicP`=gPETw%%jP?}L`WvgZgnuz~u!;EOw za#X=ut|nnIN9|U)RUu%Uda-4j{tk5}E}<)AQldyZ!UF77WiPpkgf0oxTFz}%@QTH> z)`v2O(9pBK)fc}(1LcfaTL@swy7ih(X$7%zt2(#`fFQ&+K} zqo~jC9YgOUnCzI(N$c=AJy&73T<9=6Nf<(gAeWzD8o`NBxFRuRGP-ZpI@clEFjMm2 zz?>_sR`!Zu97u85$;&e44?iQWotb+(8`Kk z09a89!yeRR_i3R*X(Pg7lrsz=K`6n(m&A_zHZkjWsx!$Cx+0<55vGe_sDaP}2Fr}S z^%F@Rv$=0Wf0(g4ug31wRL8l{8lObA{kupGWB-E-J z=}}fK;MkcUMQIE;ce5?II30+AtPScNWjd{vVf|RgmRL66XSO(@qj05>y5eP>b|Cu^ zSgcA4bDEYRuQH_MtUu`xZw^7juyP@fC2bjXx!4u?aK<=5}8N zv=+2^yl!Z|uwGTv?Dupb?{3MXFBZl-cd9HL&Z=J1CmtvAK3wiRr(=T9U( znr}M2-kC5F<~5e&)E)ELcuO5~W?lG7VPWkPR`n@Nns({M$Kb^jv$bk$L1mmChU!TC6>#c zdC6j(&1_n;(FxiG31}XG|*$KmY?(&PUeN>2gXDF))57N z6thz>L`wrUp;ORsh6&B!Aj{grPG9RuPRl7Sw@fC*Lpv227%#{bBA&B~V~Ex^bRAa+ zP=k^AV4kdNb^N|N*cO^%pv?&ui(#e{COX$T3OCAPjP2yotgMM*dsDCXdS!k`;FbEQ z6TNvU%$ar8&t!EVoSGDY|BW!@!0aOPWL_VGNrR0U{fsgxTduI<>M2@idrr26Lt|rh z6RVC~qGLN`cah0F8&O#fA-|Jj&_XVeO{~*s`cenNXf|x@yv0+Nd1SjQ=%fuCT{(~s zmX*4BzPZi$+HA~??Mhb|4ut6@7^_=rsafkNFt=uHHKiHb3TFzQ8~dDKpuOGMvCQ`E z=6Lu0*PhU%ePE>hx5*Go{3Ki#suU+hTHGs=gF1c5w#ry%G#NG|Z+>D^jkda=l??j< z<0`a4UGcJ8*%|}QrugOA-l2ceHbX3N%73S|4vPI?k+>v1WTNWowL=Z6;}T@ z$PgiVtWsa0QkD)SC*U|Z3Iiq_8bglHbmW#3YQ3bO=W>Xiy2Yv!*s6wRFm2)zGK93> z29wNqbsn}_By)8y*M46Wv_Ih!K$9%EFyMM>G{$+oBG8z99tKljqGh|U1_tU)1BHg( z>g~3QiA?u_q`!iZ-1YkO630JJl;)H9>>fLoiGr*ex46QvyLi*j5UXC$A3sG)n(h@i zJE$d!3}e-1*;p*TWu|Hug;?9j3a5jXE}ZeQDxW*o&MGK3qQbEhWLjdgm8Z;~iX1{Z zq!PpGJ?=u%8u?r8@w+_~X}3}A3I*Sj8w{bZ%+OzJ9;=0}GE;Byc6%9lU+zfy8_;LJ zT;S8_dwRU9j=V#6_mDK3y}9~Am^SwTMn6NWg6TjF5LL1gLfsYmQL%E>?oL6>fj|op zJ#bf8&hE}uBghR}VGAu(oY|yPwkj@M1EPiO9JOVYLWwvq;jFnsPb@vuR}IVfFVqX_ zE3%g*iF5=%?ewrQWSobl$IuzM-I4~qRpzcT7^^Y07Hl>bnVX`<^NyJ-jx9HYw|QUg zFDTqO8;^dY*W|Mdq&ZgT(ml8QU&0V78=Q9znjCmEFso8o9@k0;3laT{<*HjMSKMh0 zni5f~)D^r=u+k~Wgqig!m+ROy38$=T+qj7cQ6=L5n>v_=;s1n4W>{-M(WWt+o}dRws^R-`=P?y;5?e#NkSJVF^-e*XKAp zMJgjL#qiU~kV9ZsEqgyMR;avDka7AgTs>P{CSRYZ*}^&mivc`QfFa>{NN9r=$~eGz zgIz~r+7ad)g`BfJa4U7TD{87RIj|KkXA+w_WY}PT=jN`}a;oTL6FL5d*Q=xDWcJg; z!ND&aFH8{pGxmR_ndH{2mWv745Fn zsW9!Uog~2$5LhQetWsawKuszw{$xSbGqhG7IA96o4UxUKiJT#39yctDqBJQRwib6@ z9H$+N2AezfPhlZDh=fuqfC=eo_=z> z@kLKWSbu)@?m2Zf%ABc+mdDOhZTN_5TK#I>MSaCimSy#;&xc@$RRYKwNb6LCfsH69-YhG$x-J__76T6b zTq;x4se7WLk!^M_c3iX;|3#1~Ds?@nQhyuaK$sAyg{*>doAwiU?^#%!0qhD`8#SD= zcGjFH=~vQ{TtLOXK?)s9{x&<@Z#MebLe*pFNP&@pb|1H{P{*ab-_568se155!OeHO zf_^&g_vLt|cW-n^qrc}oG0k$YS5eFhkt2Z3AsC`RPTF!@23)ov=Gq*n+M&XrzT#bh zR0ZYOz1U_lULiejFYUw+8a!cU(-RBMR4zZTo~N6*oUDil%QsdLX!WmE7LGIc75m|Q zf}L2f-WTT75pWkuZoyCnwB^^?T`O^RTdn;AwEqM;{`b}Df3;Qec~juCwW`YAaPP)& zkKGbWdvU&^z{8q?kCYyUsP$MFB;pq>)Hr<=>}WJ9q*@Oew8gi~yaV;7MyDb<$VS1e z!V%SKa#q{SRtWnl2hr6D7z^?*W^eqT?nOSY?!HM-J18=rrIWUeA{&#&-0qZ4tS8Y$ zuNLbgd9h=Dx1h`$+M=N+X)Mw?_wj?Jy2~){4HNe^D&C(=vFVMATdK_M^0zHXuGw9t zb50g>V0SL!I9g>0=Hi1^$yV{FWgWRzV`nvFL;>)jW%}8W?dn;G|ck z#8xNHqR?tuP)t*(K?r)Q7mr{}Eg>-MaKmU^-xl0NK`TRTu=J3b-Aj!hj2ByuqGyn| zmgPi!z{7TT8>k30H-?(3{HLN{6g+s?8Gm;&>&ANR!`Zxm>Fk2}?8usjw(&Qv;L>F` z|NPKMS!DP<)C=j*eU#?J5Ytz2m#Vo^g-sXwMqiuAiElkYVO(4W_?FB(JQhFz% zhanu)tOiMe2{AF4G^Z26WS)n6$Cd1`jGEY-RqC%?S2FU*yhKZmLud`<6`QGK=(NCb z=Zw4MgPDKHGJD9Cli@@7P!U!(;j;{(X~eP)nJx&bdU9sF%mvzFp`AR^A)w}=bGNTk z%_G~g$IqIc+7(~EFc25s@xo!aqjz@^LSEC&l|O6^&n`%`70TX}55W+fk<-%*(}GS` zupQF8tYxo4&J|^-tZ0!HLeyqVZi>lT6%_3hWU8;|O1KHhCS03Z3YeW^we*M+=UyQV z(Czw5ZuT&M&_e8xJJV0OfjUUO!a{LSt=;MEq8HE{4!x=KUdN{kGkV<|t6tbmW@hxp z`ZWi5!DvU#WBY}%@!gkwTHLt*{z@$a=~z+#9F!pkjkg}290Fd5OD&RUZJ_NF3kHS$ zX)}YO5MnR3`*9cCGH)D0N+?6LQ)3^Ss~wTm+CwK03P%O6a8j&!R5a16#7;|<)tBts zu2=L`fe?!?NgZFNHgkW^1)JNjb!_`I9)WB5{ASs zBwWpZ|F5CmA4YOuBFk7{U*m8CdTP6$*o+O3Lv!rZ*jT8`S1CTNGsIdIaR}zfN*8rk zGRO*%q;<`q?G(n9>z}sKS%hfgAuB@Y?^eq>YJ;|P!A)#R!R3dxveHRHx}ze^qK;^@ zx*{1;Ze!_%1hX(?JjcK4$+^``@~o4@QQr@{Y~O|9B$)$)g&M3=6!>JgquD~q zq*+C1r+fThYB&2VXTyu6U?w4L~%=EOg4=Gwt%GE7Cn zKt|Qgv-8E7b=S^Lt&+oWc#v1f3IqnLBdpK4N^j3dJvoF0kbWQON7W%(D%he$hC1+S zm>$A5*)Doq$JM2Jc2Nwcs4IjpRae63bDc>Bu}jF2d7G&>OFdl|bApSmyOGBeX)b=FomeefxVe)ZUtI}xAcn}Q zMl!t2xeBLSU708v$aIK`kWOSDt|-z8T+V()b-@aoPRrHJC_u>sxf2?=BPujkWzkJq z8qkG`?AWmu8!SC^o)6&)MPv*4Tj>aX*dOk;obFnG_HRey?mS!mM;jTcJ;wnj%%aiC$VR&AleWelyUvdkl_EfF^4 zp(0&iX^)`tF}YL=W>Z?8-@EQmB(8^#)sXY3-3&sPGbc1J8j_cM;q#&BfUC_&phod0Kq(4_m2E zp(henE1})LB_d`v(b(cCe+O4ek zQJT?lF-^0^b6gS*r_N&vS7?W0OBxw66j)beq(hXiTp>iqMa{NKIiboZyde~3?O1Gf zB3qFjur7q6^_snPEND0lzTLII(9mr&&Y1xJCFWqN1PEi zWtQ7)CRAk`Jq%IoFUwGGV5(#z`9-a-TgA!uN9M?RK+A%D_ku3uAtoZ321FVu*T%Y6R#>;@URCx&;*i<$?UmAy~^a z4%RX|aV*Yvr1J$iWHE_r_reG%4&VqQ_oF8hVg^+c*0)q*DGJeGY{PElOj6HRCfMBi zN54|w^BgSh9Swh6>wLZV?icIsA463z6#fxrn`TnIDjc0sPCVFo$q42Ud@L`9l7o}5 zs9|e7v0(>dh`LHq&-}*?KRSJzJezsv;RzfE4p-91^hTCLtVUYa;SUiS;hIAt4dPGpGCPL#$&nB~hywa9@u$(a*&Izi#@_q96Z>>3h2-U7obsokF zW9C{oghOtz(md)3N2U6OQos@We7X=fj}>V%R$3HWe+Dz-q|1wwy;|^ zJhH$X&YlD9rIk0??m9h8o2iQjHUw--THc_4bebp3oO;~On!!bcP2)y#@%oN27KTjb z1*Knlr|8DJX8Yem`!i@g1O54n=?`jMo;P3oZek8|2qHmtgg~(xBs&Vv8d;|ELl~kT z7C*XbVib2gvhO(q_&bdORt3~fHr;E%^lC57Yf|)xf>yH?&iR3hH#H5oab>PxVM-Z7 zD@HwXCM;UCv*uP8oSd=2;wVRVv_QW%TW@go8{T0brI!WHiItr z8?uWThG=U=VijdRRRJ!+3hVg;Fhpli6?s-q3g(QKK>_239^@uQHnC#BnN6PDthiX{ zpyz${3xv*8fRd@du~h?P#RE#FkOowGgl14yV9$DD%GEY(w_LK~mMbJ29G5oCa-Ux>MnFXgwa|UkF9llJQ`$I7E9h1LhK=b)AX zXAaR5xgR%Cpm$^-Sl(HXVT?K3gn_3LqB#5~6HcA#fTpqq&q1+{4&-L7b97;$C1eN! zLiX$dq3+Pimb>hqnu>i2=gZ-b6G2%x$l8xACs4Da$Mper;{OSywXm!AUh~Ztn1>= zGdQ?y1@3>f24t%EmM|eLEk)PPyNo&95HH}dd{%2|MDcfFfJtFS zbxtkkGJLSPjy#E-G*e_bJ#OTtc4(_u2h!SIaZ|hE^nzmUvKb+-_Q^bRh@ADg<(=q* z3ClTo1>%HmnbYShuJwv0lRM1C7Y`&w7$3C~Uw2&$7Ch&G+_w`>$u* zk8Q_&1NpDPP!h}(z+e{iW{d>iZt;4$m>1l5?Q~@hedIgW58iu7%SB{`qHx$#QZ+*; z3x!@#tP|8;llj_eMWIcI>@Qq&@j$R8tBBS!YUPlDRhDhgQG%kyXj&!@+hJnE1x72S zIstbG*;bdJvT-fJGQ*}(*SZ`#QFxD)7>*%iFZO~uy47;Dccm=c>z98qNODNQEvO+6 z@O6RN3h0l4-dsazNQ=kA=``QjB;R^>kEyBI-84d(Ml}fYIl@nUgV&yIR&$8@`f#in z4kvzAS)`Meh!qReL@yBh(an=}$kuNhB`BKFUEI8={W`gUlT}{;qQ5H&8uczR3BbMd zYbC2$>|W$Edk_+@+sDo=*OUyW2L=BA{}{aUYbd@7tv8|39xBOmPvT%S6Z$f?v!As^ zc`Rl5Pel6``vfhLonF;i=x~}OS%H(;%vB{;&WEUT2#%-CR&0vUlIIZOrwAU~n_|uf zLJZsZ5Y}=TlCw~#CMan#`(?WzxP{e%x{8o_L!l z_3VKxvb!aRbfx*FeDIIs&%T1}%g}lmn(sq<9Q4J(K&s_QzK!A4cDF|}BQ|ovJKXF# zbIXmEy^v-sL)iLOk?8gXT~C#z2B@}VVja!dK_16~e)&Lpr5o3ZVs<>i+2`RaKJ%n}h%r&v&F5w)#m2&r2XfDo4WY$6lt2iAY=GC)ljMWj)BwPD5% zIm>l&lG{<+iJlXSZ0vRFtIlMlZH5MG0V-T*vCXs&5sKX_5A0q8f-yxiWTiYEg@eBK zE8CK0Q8WzwO#UZ-Q_Vg%BR=?>@h9&=@hNCM3%&6$Q$;TCg|=WIPtEFyhUS-3A&;A0 zx@}g+PbP=dJH8z49^I|AxYIZaBnS|tW{9HL<&=_=K^PdVicl-jYr;|iBSEI8^QO>O z?U^Tia9P5t{9{S2xJH$NgJvi78cfJx&R0Uv%W|6fOtwPEg`1EP3g^qbv26tM-~?e@ zIQ+4>R47}Na$M0x(<8z8e23qK_2taLFcu++tChCFrE^2cIQjRAoiTV1IuigKN@$H7#%GEpZ!J;eZ zV6t46gP71lRLKxqw~K?19hqA@-2J)jH=peL?pj|2TAcL){%1Nrma+t^5}a zQOVFUIv0~NAK*Rk`05mSfNxpSX0Atr@ALT-e?xiZdRca>uTyPt-A>Q1j&AK&3T;Ga zSS?BZM`Xx>su!(i)p~>NX&yktYXzRGEA&86PvB*|I>eN<_|sz~J1<$zp>4FKj($6Z z>4+^~adaW~WVue3z1bwpO_1sW8H>buqWsats%OWc{0davfZC_fl>n`YRo5@~hc&~< zG_;RGe2Azv7s(&sW5*wJEr{JwfbB_68z&TTQ0kj zuk2dI%F$jf7>6jC^n{;yP*J}sdQfPjtn9{JIE~a}Bu6B4>*10Q9gZuvsC=rcJ{dZ> z-gL4;;d$BvbsA0G!a`T)Qiq*Bc1U)lhsD@IQB4S-H%eaEjQHNLT-96qEi^xa;mnOJ zk38EagDLgUGypx5&@u@93(z)dh|e8&vt4**+i}NsAoS^Mn9E{r+GM0}+PTxc^?jN{ zTNp?5JU3qyf&(xF6+&IZXfwm1t1?y*^&?oFLon^IzL3eG)e+gC3hO|fr$OkxDa3GE{=GzxXY&@>JuEu&A*)qHoX&C_GEC}Jkr zYdJr4An2BTF@;bM`GWloAL^ z_48S*21Sc7t6GC1MS8}$5bToA6l}P7m@j^QF6Yh%#%eF9x(`j)7Lq(mZR{HDJ)mk3 z+D2e(76#{`XBbG9=$(V!NhoeM+`dxv$%R%=+vRlsnYgg&ti-Yh=c6B9+j#Yec$_bF zJDR~V`PFAV$FdYP3HBnaH+I-BIAl&iCIls|xU>P54a8=KgQhG+VIV`l1())NYv}=m zunj(DSEgi?cywPboI1xv4hSnN{848P(KDQ)eiJ4xWC$^jz=k4~{6c=-Yzed}y?bH1 z_$d^=4Q=+zDQ<-quC_&`LDd9I%s~GbOi#nm5VQ=#$UIauLVgFtWvyJfQ1Z>Op3=^LR_z}L)ra{ zBS}xDsxo%E)k2g5l4aKF9CFZN8X1WxMJpj{Q4x-XyvkhIL!oU3#wMX}0=kA^WDb^>pt~C?NVzo% zA-Uk61ov;Hy!|0L;JcRMHj@xqY;(Ca>CS-nm!_?S9g=VbrvQXMEA_=o*YeRsA z4Vz?y37I3RB59Ly5sATi3E#VmnvGQF$is4&V=S5VR%f_f+3hdPSvFAmow?4b@Y&U} z6L%L}v!JjG2Bx876ne*Da1N#xU~&=)o1uIVs+%Ds30$A#e0;p#adWhquY|0l zd+qhM`?M|@OtAn{@ByL8;*V+pmRLd=LQBZMve?mFp&puYfR;%Ve5ixiKj#fL0kSz{ zuak-hmzZ~dxsmcc6urNe`K&F{w(Omo=CEoADutXD3qyLwEysMx4TkkSAr? zLan6+9C`}0TMk(4YJt^Mg*+)X32A`%LkXvNrDkyAtv~(lbH(lhALv-v52>=qy+#x; z!Z^|qIr3YcZ`~69py24QYVAIQ(vO!Ct`~dUZnl3ka?K083L&Tlyz`*22U;gA=SJFx zAhr!EJGXo?Af{;ZO8Cs%-{s#rHdAhF&@8&o|7wQl z!2w%)973>Pc~E{)9cu$uJg})>rer@>RYrj&>yR}-r{CDrN8N}@COd9nz2}`ejjbG5 z$w%O_Vkr~?ZWQh-mqTa|mSxhGfvOS<3=^1_VT&xHv|@_J$VweNPXY~b&IL#RFq?20 ziZ5;DU8-@qTj}_y?CUdI*W%z|0yq~zS_`DqK*cE34nlGb6tqKl@peSy=A-24FHRJ@ zUfC{*-Ykt?OpdCuxll_kf~>t!=Xr)qZ0E{Iq%L*)zDn{3<`Ak1R)MIfUx{VHOK90h zWB2rwW@d=VGovt0Uy!=?Q;OVt0XDNV0Gw5N^do zcr~Q8LQWS{_d;?lgcd<)4LGN)`e$uijqf;hr!LgnR2;IMAGDbKvfB1So%0cBw;2uf zB4h8KhO!K_`{u-bh&m`k$ovmcpD1*3hhrvL-OM49RT@PhA&V2oB^pb5_{A#Eg$;;R z9HiK)nwa7csH3P>!5%x-Wm zhUaMzS7Qu~Sv=wl52DL&T^ULYgW?$SQt5?Mmv-;Rjef_V@px-Q*lv|Yr_U8B7B3x? zA&0;aN{IT@3Kx4MA=!~FNjcq>9hIjd#F~m-aq**(qY=`QU#6z)@2H*h7o0D~m^&9i zPR1*;5WAOe{5F^$D#7XeW4$ z35J{S0YBisn_wWnke0C4pBMb6|IlFjjVbpWbUYr3c@%y1tN8nu`+eNE&W9O}dl_sa zHf>`dtP~t$;e03rRKSxcxaK|o(5L*_quJc>_44S&6wk@%fZ9jL+QYtprb{&;@w*Jc zG%J=EoeWV&LZ)q0kPt3f3Af5Ob}w2jSU5l)_pYin+xjkW{N~e6kEg5U(Q6echSJETH2+cm zCv^dL=dv#v${*Eb=I$QtB|{4j>R9If!x@4e6!Xv8K}q3WdT6sjo@KcI@lEVr91RdI zR4iFJWMQo}Mp#aeX85~87i62z675zrNt@-+JldYKkkWwrT>)H+xG-0ja657*m?`eL zbpp!=)|s5!x$~P`R-_4&P8=KHSJYOz3ryE#=6(AQHCO)B>iHeCoL`E(RQvebfKz9B zp55C@4mSh@%zg2=@B7PhzkUd3Lf1a^T)yBpVf&!N!EvKFWveV`H7n3m@NzB5yUru5 z*XQbT(JfQ$^S-){on<;Yfpf*4cc zNpYivnwC!5s#-x#ZHKaKPOA=WmZLQ%cg7bjLFtvr3P)yy9o>tSHZ}^_CmPQNk(CV2 zPTDgoI;0I-I#O>?r63JRoW<|-~Ybq!JE)<6Ndbn?|tR_ z`G=`DueS%gY!szKO6-Dz$M6f!aWBX2Tla=+pUp=HLVY51WvmwmZq}ud16e)ZkK03E zwEKR%koqrH^4$B$xkbw#M-Q4CUrj_OL#PaEsX|?&4Xu!u^hdg*c9o(o>d21Tti_I{ z%^_?;7cvB^aJCaPPY7tC0aWi<9B`?I-NezDQc>t(v`u)qB>A1bYC}6UG78HdN(1Bo zCt)}=&Q7R$3WtzQ?6oB5J(@5{T`If+3TJJ(u4Ff9AbT;snC{32Sm-Ry`1+SCQFlAs zFVAJ(fZ5Rgpd-O=y_WR#7bP!lclh6f>NrDIq&YWwJwMu1mJH<)(2@ZSsnAifQJJ#c zkU1F>P;mWNliTlSvff)r_*qws|HAyzZk5H(mqPtj9@EJXIst8|%IXRiAzB8oy22K< zh(9ie;4eZ^#NV|5RoKAwuizecPz4vVYD+jH$yjT!Z#ls-nKhd;81ae#pnf4@MH-+$i~WA?5LK1u3z}do-}hVi!MTbYiU~ap9j% zhOiK4VSzJ2H)-Lb6=13~)C<}Yg~KIn$s&v!Q6_sdoU)Q&uiUf*!}6LU$|$l4B@pMR zPHQ*|^fh$|M+p=~w454-A2^Lbp3tPET?SCY=(v>0tOU}nyAZb=Jmt`j?Qu9^X2uzD zyrKrP_eHWnAs{20@H$KKnH*2o!iFutSP#%B(6GX4V^YHV|1c1AdOhfTN5E-wlfzoM z$7n?QT#94!mA@^$cO~Y?`;DQl(3Ea2iP$dBhUOe|W$IR5>`bgv_45lAk3JX+JGxkM zXFmJ$(aa|3M$We7V@8UAQ!NdqqDApX#OTK?>8 zHR2&Z8eMKl$A*EEKz1)qpV&=kgBA_MD!k>3jTS|oPz9)w^aIumTI0DxB~+NvP7)7% z5;IB~r`hy(+Kk>riYL72S>YXun(6%&=xXe3XUdjaFR-$w7FsGCljWcjGMu)j4ahF^ zj0!ej-Hr^QvcmBH)j2N9FI#&@ipcJZyKF??vO0pbE{z>-vg8oMKtsZJzgqA)1v&P! zF_*_8POn#Z4yT4K7CMi={Ht#JUt}D8Kl|M2F2859X%X`oF|$!VLqSgMj<;)l?FS>j zoJ~14mEklR`Jyx8{7^yk#tN~)1SaGyO&8?N%~RYI$I@&$Z0UU*|Y`9gZPv z2yp;1a~dj?4a5qKH=f=n|Kt4W3W)|A`$0X!KZFaN0A)FX2^-^BdpVK88EJr{)7~fu za2H|;nt=mRYjHV30MTobuVM%>@{t&*FaYSa|EYK=;7MozE5y2i_P0IA@wW-({ zI_FhOljYhI>;&VBf9NIr%7$!Lzl?aJB@HO1${mKxH)O7bDLv*8x--IqwCviWS++Lwe8J~mATQ$k$IDGiCiAHG&VUuGQKs_xoIXShsC*x z`Pmta>&DvZ`Xjt`A&ZLJ&EMph<9S65a@yY-dXzV7y(yrPM|wz=8i(cbRq z@%F{>zQwWe@w$qZ?A*MBjPcUc!M?$%{)Xm~th(%qwZWOO+Ununs`li}s_2r@-j?RL zpsJYI`uwuC%=pTj+!7DZs>IO3fb6k`g6@K{p@xF4hQ{8)vaycF!Sc$1n*5pej@Ig; zw(82!-hP8&V{xQ?q@}(;BV(q$eWIgvqO)tfw{32?YmsEz3tsmM|K&wq}RdmXOB8w;SuLbKAz%NqI7ZGATuTDkgvFNSj-16(pZ-YOdf$5^q33#D ze3$vfe;RN(+UZF@}J!*P6@3I^&xFa?tb0kb*Ve?c|%V6Kw(x>a&)7Acv+>!LGT%_Zs{>TjP^!qhjhK!+NW;>%yLOIJr37~*c-N;y z_hyy!W+tz%_E&niR)u*^)E18wWYh(_^%v$0ru!y7cu*A)*Pa>GQ}NR&uj%T61t(cdU1z>w}a>51K+=cH~C(r}oG(yxjR_U2JHBuUCIrQuRxh=ERq+k3Fp>!lOOIe>gv+ zBf(>+B6_?cwmINg()r6JegQo(VSUNZo5Mn9dP|qubB8luw5EsmruocPMouJq)rYvY z7y0#Ngbe0K4`xP`IbKV%cc@B<&2w>zzjr#z^+|%`v$7c1qaqY1|t%+g1HJR0k@onj`Bdzt5 zjpfzJ0e#u=MgHLpae-AC>Gj!u6+wP2Sp|KyNjXQ~n11%&lGE?zy}w+EKD8Qgyw~ZI z^i!7_JsnDJepmY7+d7x;M67E(i>B;|8gOW{@3yz9Bc79S7!fd#f_sSNB+9?`n#sYs|`-4cM3xINoAC4@~z|f zwm15c!&}1LBCkK_3UaP-cdGSwt9fy|(*91Fy-kVjS4EF*jK{wijdExVd(;-QJhRUGjg4ng@U_*P1p)t=q)d4e=(31q+ znJ}0GQ?<~M0K?@l+h&|-G!ECoNCWiM!fYq3_Q1*ztdGOSD69-_j5N)+m73S4VH|%P zhPA=%j=YtEfaU6FQ+wJ*Wumz`bE7eRqds}1G=8BXVY)cH+vR>+rgulGXZ5ou@gZ;V-KO_?e8S!_<&Y>8fJjo9vtGq%L6*T${aC%{74dSmQDxz|!# z(nNY-Thin4f|tE1PY05nr?LVD^Zm!OJVufnx`P}mpIrFH=@2- z4?ez-VB73@r$64k?7`hao3q)MuV-BSG~?o_=x@mB_Fv^by<8pOy42MIYb13TER*U^ zStxKEjlb6R;z;Y`vw4rdE`E8nFZ9N6@U7-2ALV}i%lxnZX6(h=5OcQ2@!i_Ys2xU` zelkInFDH38KA>pd~U$4FYhq9Zm*FXBhu=l$|o*(o$zTflm_0C7X z?|Jr{A(wZ%T|aJl`SFDRxo+1>9nMGF{O*iL+Kh!<8}Yq7<$He8`$Wr=PbM5b9r8R{ zcjJ>Wzbli$SGrx!4g}avMmek|c#K3n==Hcg7Wrf_)S=z=afkEWF7HR3LGF!#zO#8L z3xyF~kzVbg-owek14+T-Q9dK#uDu}-8(i#qLY@0Uo;EpME53Cy;mWz*2>X7&hwYxX zs-ImhxOz6{@|nCx=Zl|QZ4G?V
      A!mT&bb2uS*GSRd7#l3bv*JjU$rEZQjp3Vaa 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 z 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

      qPR$`H&$5squYhR3G}m>T||*4lKA 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 z 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%0ABxJ>I>{2v8-3R!+Kl=6R;pFF0M#rC8 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 Q9$4Ug<3$uyJ;^`+*;Wmt`2YX_ diff --git a/readium/navigators/web/scripts/OEBPS/page07.jpg b/readium/navigators/web/scripts/OEBPS/page07.jpg deleted file mode 100644 index 08d5113fcede9f1ff2365a4458f4e3e417749bdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68602 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%0D$q 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

      3322NT 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 HUWfnL>%MW# diff --git a/readium/navigators/web/scripts/OEBPS/page09.jpg b/readium/navigators/web/scripts/OEBPS/page09.jpg deleted file mode 100644 index 52d85b32d52ced8197fa0ce547092e0ff5339084..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55182 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�{ZM+)@_) zGsw`s0u;vmo67zEMSCUdFux46aq_FONKn_3nB?V=cUr-hucktYd3=L|KmhD-GK03s zBbz(gWba^X+fWNJui|!7tDA2uP4dlroTEyTqh93(;<$*~U6f`dRmg-ECwnLfyyb@4 zOG4}+OydwDB9v0O$reMjtyK3dCIu?nVpkyRL~44D58QTJHGOOIGb`)Htc^RrP>vlqHBOd`%jXYsZs$sI zcc$adIQ5MXKD1pQ3vJF-f<#bLq(7kS)UaD&n)(gxH+{R_mAy z?pOJh8|iaZ#n8Q=`wB>s!pdYD8d7K34*fHFX_n)~bg5Cs^Jai&f(LB5W)2^>eMdY$ zbO0fgQfqU8mioFsqDh3742+aHszkvZ?4up)Y7Zd$Vbau>Lz&g+^cgJ^%u%l1jmb_K zSY766i!k}LiOrXjC+f#kh^Ayg501^`)$0 zVOdFvl=4L_Hl;b10rTfdY*(MWFE8KE-98(~K*VzLkCB|u3ss;xR$u1R5@kPM7CbhU z2N84KnFmNPYt9WBh81~k;*~^z@!XI_kvvKDLeKA>z6?3zwTf9Yq472VThq#`-#ZCI za+cpuYwJ`nlMSJ7H(GNRKT!}Hc=m(Up`9Q8FjvJ*u8*!_6+%$Rw1RZ<_5C*GMrfC7 zoLTeJ68ka}2Y`Cnn%$@3-npD*#OL86y^u?_b|Fl6{Okpijk)EbD4Bj309#T-rwWRh zc0$Kdw%*v`N%Q9YhmwD#m9WnR&u%N-SG9yU^a{9+xoUbz;Y5P&GFM#e;*+G z{!F6Qosnu??BmdO-Vl_*azeBUk6gk1&bftZ6B~4s<0kr4S@n~6!+H9&(#;64>{dm5 zPyS;rVa_U2S^P+k+|l+6lP~RN!_cT= zlORn(f-}MUh$1zYugJ6+J(53aqhifSv$ z&Df}Inr`c4<9V5|G=9jN6!X>l!4qJ>aNmF;ZUU+PsWZ5qXIMAJU({#(%c(= z!&fJYVIip>0zQgrtgJZ;TFJ^s0D<5GnJcTkCTQaiG(Vdq2B~VZxqXY*TCU#cA84#p z_07^Fk1%ib<`{M`zQzGZbpg?PdQ;7)+~DjoqzXI>8&-qVUxC`8O6))n;)>w7!Ghd+ zkrou!JNz)cG%fD0ZnNc8g=v0qzPzh z#ujVgD*qVV)HC`1a@3|s7Xk1?SuSw~vvyb{U%alORGualC7Y?79wV=`W?XV}Al)vn zCE3fvSazHrfb*SFBk%qk6qG~~lRd~O4G4zLEhh<*r$X4qDzJ^jgQ|Bw{wsAhKodt) zSbv!`3=q0LW)~Qmceokou4^heC&Vz}9B7wzC;fa^B4te$oO8jGP`$#%5zQrRk?zF# zv^|E`4f`iMa00G&`}fH8%0GlWB#}yXQZUz>Lvv|5HOtuBQpnQNQ`;zgY8wB0iCwC%y_Jva~;%#BDbh=Bba<~ z+%vo%>^X{~h*ZUSUTxiJ18Y-mav^gPYnj)7(mLY$D9lNJ7(pQ}w9pnTEQ2htLavX8 z?03el`3ol*zi7kh!^L~+c-Jc}w-n9IonR#urcD+!(l8j6`&eC#+sk7FIO$M+UR}L( zBud=BIBPaveUX=@L29~k)0uMQNw+q4FEG*jddo+r)`7h%^piPpw)!%zy8k7YCz0T@tPlEP@b-$TTYW{6)iJ&`{i^O) zA(N$k{fC-n(35Mr_|bMvvu>yQXJwXRzr9;|wT?GZPsAt<+qQK18ux8!>nEa2oF|=# z{f7Byutxb8h~3T6sjrSVeMiU5!w8`U7DI2^o9_gaY`6V$g)<0uBz~2f#*8w9 zqhkffV!bVi-k$iHaCD^VLi}p;C4B+3-=Zivlz)HO%)#DuN7!!V!9i6Jnez5WU?gFu z8b|n(xcPclvuLI&a*tWZC=ALB+fna}p23J1n9K`MGu)p4f(!NIQt^V9jC=PlW$s45 z+*_z|EYd(!EN+%S)d)7V_};#`%Mn{+Q7sefjpUq=C)QQ z+IWoht@xgSuYzb~S4W|*Kl%thlCGSf1Mp(3Z%^|>&FGaAorkhTs$^o;*el|9{%jE~ z;$lHEHN+RvJce53#73zvMINCVX>;>&-t_KtYYo^HUw(;rJQQ1`b9L)PmY7PFOP;WbSmUPZ z7=?q}M{!=(t*Xw^uE7ZgVH%B|RqUs8(HXH>K}02|%2+lo54iFB8J-UQ^M0;o``4lG zu=x@@y6F71G>=yB_zB_26h1KC%_nQbx8X1$Es1z1)J;Hq&ji76+r(hpkWSiSGHEFB z4u7?#APpaVchBE)E4KXnQJxjJJ z6NJ)VLhRFAk3k+-XSF8pp0B|;T+Hy7auBdiTy3&Yp3Xqz1THbeX}Y)-%aIHsc4+<% zE>J}$Pp2t1WfFLVkk@P+PDYXyMFKQ7QAu8;KK@2vI1xKMS)w@h*sHbjAIF;D%rZYO z92X!tw^vhMfRjM8c7RHfr8``#wPC2^=U`1O{t;!?M9G?c2lmW9d@cS9&{F65xs-&O zjulr3jVfKi9p0b50*AICVdYP|6RgPMxXtsHw&xwdC|%K>)5S}a6Jf*vO3C%i(h>a1 zDma#>36nLZf2tuf;%=AqpY>C=QJ+Eq9pE3PO(EZo%|CuBpW;wq;xuu>d3K-1c#LZ` zI}K>u3Am^<0y#C^feQ*GXYvTnh%f4r{bOgcUPn=83CO}Z?z0ReAAfr2u7*1aWqtGY zZ{@3jQf(eZEOe1teJdZZd6mC)`b0~u^^z~CQ*(aMnaR$Mt&fvp3h0xR$izzR{>r9B0=5*WE(} zRUlljAo)q!!=A((__1n02r^&vNL-1{c=uz3N;sYeGfY!t+DAjhij^9yArVi>T}MSh z{7`u_9fxn$qeQXzT7(#AwAU|^9XnGso_j^qQ} zI*o7opWZ+(RAs#7XJ13eGwfgG~t@SvJl+4OR zNq#*jJpfyy502l4$0+T(Ku~^%_$$g!c4J+AJ&XG)p+T%^FcgZA`D}Z_LZ8r#XIzUg zYB|ua8eb*%IG(sQGUAOxepX4N%+?1w5|ZL^@KM3sLDWj{)>la#k@jETDL5~EmVyvn z@W8?)A{Uo(9c3xrsnDeGHdRJrTY|O0FAZ$4_->|uh5j`_k_TgA5{m1ELO`97ff8#^ ziqz>Ypd0wlkyWhLPuhq^Nt_MsBT*)!P*6pKekNp0)YY*a1k_haq5@}ON1*lU)hDlv zA*N(TQ$sm&zcX_z`l)pHU%|T&bIt(*f7{*QEeZod;zgYDQeLu4jc`@{93D+!A58c1 z{l&Kdnh%_MiE+}9oEojgFY*Q!N<66j0o6{$zPhZ{T01=EEaMjmpDI38+!YP>wDLN) zWY*Hzn8mgRprVAn%@aFYBPq1*WwqA$ah;(-6~V;+^40YrxNbh=~RFWjfZxpe2$ zyS>XTp=0*wct_I6qm#C#=9U=b+m*x-^B2JRX{exP!;g~VPtmWT@;4-LCdlG~o06GZ zTSvHMG25b%{vge-BaVGaGb1#lu!LTV8^Y{fZ|J!w6Z4EYafY1LDlC$7R(uViY`Kvp z%wSPjI@FS?GL-h^k*965hH&Jy#!!z&SYO$0i*rK!O0aUdwNU{fp@zGDVr|^H)czwD zlUgfs)?N~iNfGY2a}8TnrO}CpC1Q{`Cft=&*OvyAqAr>|VMkUxr3x)LSt^Z371yk| z9^Z=bYeR-Gs#oNZv7-^znTyeeau$xc_CU!m?{o6<4!Z)dy=2^9b<+MsBpP{z$FO(Y z^Db|R@Hn$tn0K6Z$(fghcXMOsJCl#>OYVz{jgpJbI6FZyfkcqO0&xaP#k_;*#yWx6 zFp0U3wz^!@+Z+HV{a;ZxOiQV9-rSwCB+?6OHQZIE>wylXmEXA_yV=>F zrP?NH5szWTiM6CyfH{=YL?^1rc%|Ti$*S1gd~t?)R4t9N`B>z&k#gQAEI!dZi{xB- z?!^~eLbX*oBV*om@i_c`AR%W?>b|ef1oF|H>VOd=Eb1JVj^@p5CWGe6e>OX&@uX^6 zBH@2NMiSQQ3|mn32Ay8CU_vv_YDVweftcZa?8E1(pvRb$Ck2# z?qGBkqQz~v&d!M`E)x6m3gT;1T=loOo~}7B+ULTjYF|#6E}~>9`Kj26uT4CIOr?#?80q4*NE=pRsQFew@jS_pFs5jXiw6OIGZH zB_INCa9ZT{Ne(h(Pits)iH_y$2Dy8tDlwa3q2u(yJ}>UI*-DMKATB}6{!yF~ops>n zrL1@MRhTp+HEa~_{WKh?^c(XL(?nX`Z65Vf!w_rTzknc0L(8ox!;K7BGBL34QHG&K z*1~PSL1ojO=XpmeC%TSCxrC5cK0TB^=1oVZW+*;Y76m$AhKnD4xVb9su9Mm-JeDCL zIlC}lIupxPG;lC{b74N9N(R(@*Fc-+TkGbD__6P;b8V&WOSVPu26);vkV_w7mKi~7 znP!ckr%QhRNI-IdqI=$6gD+EdA7v@x(^gT@IYP&ap2SM)x>YVoZmaXLa9{m>wFbloQ7Lw(r(4q>EmT_rz(!CGn4DiR6*b3ZpI(WrQ8I1I#2cEK203gySM7(J8@y2dDG z6?5L-Khy-^JO$d;`(>T(S%j0sln?y2qstQK9tSgyQN>vEoUrH&TT1b5&-8zqthP4I zD#>Qz+LGD`2XIXMW(sJLauZoZS>PR#u?qIE@o1QP8Iug1v#eoO@+yiEz8v+x&1q66 z68hi=h@Qr}dBs-wKv#kOA%~LVrd*J&5z)rt7QHqg5DC6|gmgDgRN=0GO|{8*a>zG@ zT%O!6_ToI6f6Y;XUo*cizU$I%ztNi`xp_Z^owDWw#6p)ZaTdc3ZU2of5VUX?!P=(0 zKjU)5&J&X4SEZv3mlKELuRBtuFlEXyIPHecSP@?}760>^^3 z`Ok^kT?K2+5{L=ePvO+>ir;Nu8G>H$~o%iS6NM`ux}l||52`^e4qAElPJ^}_M35N+VMwF z#O-4|ffVqQ75ux4ANmyGC(<#vF)Nzfczvh+|H3gwtFTedX3R$k?))0dNbBC*V&hQC zVKqh5_nVt0!>1k$tT!|PI3iZftQQw|*Nxl4JjE8$1@L1pI_hVLg{ zZ7~`}Zr(qxMPR(~piwufK`TJDBXLLqaRd&xZz~lw7=B<$Dwd6Sm5?5LeOs+=r54a9 zz5WxuVUOimP!MALf-4EaZ(HN$nEQGb{>^r6lmm^8>naUrCu(Cl4h0g{H~hocWbUoT z%FkSa{U{3riRE5}I{z}nuW1OGWI*2_CG{VK_ZU?wq}#GdGHiVwyu#Vyd&V2vc0wb& zxE*oSsr>@ucLHY$&ZRQ}+)6If(&2)pZuTWD_3}Cru@b78XR5=e(|_nCLt(B||5P4@ z0m0fhf#2;*<`|@PNR#*fTKuNUWzhE1H-13K{bHdnb&&>J-x3;w=6Q}84N{BvT3Bsa z%~FgmJ%P^t@cC!Pes2}vN2Z0oTo5L19+n(=Z&__SLp2ROS!6%KyzMq+YyHqr9OQISn_v?P!}3e`%nAFs4SNx##UbhXY;bItaJD=+#ur8&|0uBBPUQ-SA$ zmEac3&*Gsb#BmrlDIYMB^GMR;>*mX(bq`hZi*Q|CIU-FXU~I14tteE`p!vEf-rigw zNBAwRz-E`M(b8pl0Nh1Xd*fbQ29^9pne+Q{K{G zkx;NZBjw_&#Zi35!((M@=tmDK+}r&{nA?W)mo$fDCF^%OTlpE+a`&|)Vz$QFp@$2$ zf=<~kuFLfkzAgIvkxJuTXe4lQhRe&v`aFl=+?kvBit^@YK@i+3zP8jqH&85X=1v55 zLGmPsK%o??4<*gf?ry-nrY?aa{HRjjHV`5WFnO&CiLI7$7+UQ1c8H7$5LGy3`0BL! zV@-OXUjV(5`@%pqNu^5V;5-SAk_sD|zubIi+Irxk&vAqR)@uGLqX4{=QU&<8KM>%> z6--ZM;H1EvstQ!DPrN&sa31%TXP(nALAs8=P>*47YOmEB#zQD~aL6rYpE4*h2cHX} zc2`w-cnA{%Aq};u_cjjAKP!)KIMKre5wphl`5LM{nivzq&{Ow0EV-Xjac(-;*UxEkeo|(WxLHPk zMEDhg-wEF}IK~-@7t~E)VmE+; z-Ck+uhP$~p)~AeH=s~u+{E?gLM4|<8Suq>`WuLz<#e!=#?D%dBd4AQe&V-^I2>Swc zk(;2bt!2(UT+NkS+D@a;-+}~1RkQ^;aY@T)?6~iYo>^2C31`Jx$hTQ9m$xRodjKcK z`$D^Itga-9PJq$9)RWc2W}bfyN_zU;d2alvC{~;~?qFY!s#x9SZ<@zWBSbUpab?S8 z9{L-mOsi*YS&%7Q=|t3oJ~<#f^h9fI7(69My!AciXPfF_gxz}PzFxB3SR7GB1)DQ< zt3(+NBarH?H&ydhi?itiG6F(N$r#`T=U1i2!yFq1+wNx0ZI-GGAuLKM6SGmMOw2^@q+bjS{mMsU4S#Z4v`NXjOv|Dy>R|LpUT#bQ zo+WNcfpBj;#{?QE85jxv`eXN{%<*w+rKuEp;LqfhKQJe0;8NA3Rg1Nk`{ z?*}axL$R7a*>t69Do< zcJ1x2!#N@gLLamL=~()$4_4mrBN)mfZ?-wVq$DrPUE z?AW_vZRFb=1L(oN%a)^so)xnRM$GcV*IQ$-^%lo3-1y40y{_Paj#xECUj)Z?X}thpA=ll)M|nlddK4}fx+9LOvL)4+|S&Bj0v{E(dZtgHRfWU?*iY(*hEs!=aD zvkF~qW%B$|5$`M+r0)~fizgfQ11$xock7=etLsW`-ZH)U4v$2d z3G#yMOTEF3J0=}nP$1faS3LS}BBw21T?f9EmnLx2RCn6HEoa@ZV`22;i@Q~p39D>T&q{fuAKd|Ql`EfU=uLG zG)69zZ+KMqxxG*#Lcu>st4GsO_F!i!C51)I$j1Mfez~(^Z{x9~h$Hu7L`C^2_f~Vv z%>@aQDrdf#31!G{o(mEF#|DtRtRu`h+w|?$_tm4q9R~vyqI4nW%ot}h$V?WcBA z`!Gu=RYt8q=@me<+%y8y{5YFfLW=!+9vnqnD0k4k^OISHx?frjH)Ii()hH#G_}J(T zcCSoNzRcC&3qF!#gqQubT%gbwubz8;DAK2&);j9e)F(>Rd5 zs@U;eMoAJdvH2b!U*>U>#x=b~zP~r!lN=wb^|M>Am3AcEGmx8Ab-mK4{C4TNIozhE zn6x)pIYP$w@KKcW1A~69RhBFlUf}O<oejIL3A?Bkz*HZ45quP9G6Sig?2MLX4Bf?$MF4 zO)}jZ^J~5))F_YIj56G5R?;Lqz7D9z4e8uw(C0=&1#n#57bQK)dc4H022ag?2?d(@ zCfTVlIST>z(_W4UWe}&Q8h}6Wkj{aW9Wr4{KHp*>MHYeqirr zOoFJr<}Zc$T5^lc>J9jiTX+=2f7MRtmHP1yMA|sY>nb92O?KK0M>ka*RV0M4L{=Ho zGWk#=R1W05QGt^Y+I=nklj)6wz``~P7)=SttMzNE8$Uz@?m~4XbEKx2Q{a=3NzI(V zn4&FUL&>bcBs0?N=GPqWzaKQ+kw%k!{bo2xe+8^Na$6tfoQu4fms$Rkiy=XFpnHYZ ztw-QYrl#YYg%!0eYwyMRY*)y*o9nr-pPldcB~9iP=mQlhL9zgBJ?V{4DcdNrn4RjQ z>w>^Bk{yRptSHQ^nF}J8lBs)a-j;DfUWKeOU5y{8@JSh4XgRlA32Uf3kp+@-fsp*9 zoq%X`+i6Y5@LvGcKq|jN;2ytUz*F8tk9_SiJIRyt50yVoYFoJtG*`W}l4)TU^B4#i z4hbcJ>JL3CNc3x1-CpWvyJ7cLj~|sROR+rpnC)SZst6z+^y^6^o;cn$Si_CRLCFGy z*z8=9ElhhD7}16>NXV@FyB)Jg(zH;ZZzykZh8W|4o@(U3Wr{hPbQzD4&ws6CNvOur zPjPaoBt;I$z#k_V&)43X6GRYCVDgBdg?P>wpmM|9*Fgh7;MuAMJ9j%D^VX?0o`j=+PBS&CEc+FgIT4SQa(jDI z?yjE7+-zd6D{aU-Evmr|6n_>!O4`%3d1N4v+>W)Qrf4D)=3F0~94hr+%CzQ`Mm8&K2cu*3 zqTr%ciptX6LdfL4bH+c(t8(1tKAv1-u6v5BJn_XJ4Z1=&suFqgNxhkhj!MzE%ZE|m zrJ8a-jP|J3FxZmm+F2a&laomWjm*13kF%>b3o_&pTd8RUf~buPxgRu)bC2+&VeV%O z8SYe>_gh%3!2J^O?z?WS%#WU z>`%&{jUHkXQP!Qok0b%c-i3`e%SM*OA%Niz zur%g&oKJ(u6ab_TEFaX?GHLSbmr+F_+X~1@kw!rJ z*42iCE!s2O%JHMGETatHT=W&Ib0xNoV7Ac+l@wuPj0FSV6gSZYy0MnJZKjy0Vu5f} z?vUWIsP8qHY*a@d&$xWMdB@hUH4S3oR`RTv20WMa9`#P%*6!(xv#~DNGCu_W0EHF{ z_9wg4ZZ4(UAsOl;9A>Oq=}OA-Y78Tc{K7C!Pt^YaN^pBUAe4y&_jvi8kKG?yfSb9O z&6oGA=jA}y0DWn-psZh$Q3{0H!Q{q({L6p{_7zcPy1HQ`F)2m|_tKt5I{}>jH2ENn zC5`SRhAU_>m1B??^dIC_E%%9}GDx<8L|~Q6W9J<+?N>^S>OXZ8DX8vlnJu)}^CxLu zY;I`Kk~#k9Cb{iXSGc=rL2n`;-~|UD4%zjr+l$t@opQ{00h_r#oOKn@_;bpdxqG(!Yq`y(~zdRK+)G@qPA zvrfu4&mkq4*0qh5y`(7wF$@8W4#VEAt+{YoQ-hp)8uD>C$<=n*9ki%M8okO%6q3ss z0Ya+n zLH+7sxl8pD#>PZq2mt3571h*M5wptw06TPA0J3gv?QQpM-dV7NrsGlD?vi5d$;Tt! zs9F}dBI@Nz_f;f*byro_(@%}#iw06MTR2qz0PE5M&x-Y-q38{RY*5xD|I0IvFdA{ zoG#KMsb|CP+J2RFsXJm>L5323@ng#$z<)Zk;dzwnGVf(0?DFF$8E!FHUUafs!EWq) zxVIHtW0TH*O3>2UDD@a6l!Z{=J01oGIj)&48Z6oIMc-{Q}3?4{P zRBb{x0DbE_#5ap`sjI63q;PYPGf5rMivG|R3OL+x?^6icA}(6ZBVJ4i$}EQf``34& z5SH+Orx?#8-n`N&vL}#yyXMCS*Z%;mUX!AomeApe0RYLYYiP-Pnhthcmuv<(=CO5~ zb^(qsWyU@IYhvX2ghrcw{{SS`M!W-EjPQz}4EqY@k(=1BrN+5nKKDFQ>R_AubnAdl zJ-^AREEyAKM$Uh|$uyV8I-0p*wR?SO*lS|Umumz0!Al6#Due1ss$L<~PuXp*RdFO} z(g1$}P-@pHYikFX`12?Jhx}@fi6wcX)Aab)4Il)!d{(f9(i&Go^jKayMUqD*Mg`m4 zn%+&U(J6d+V|8cR6^k*)hR4de_N`c zxRu~%6i9(|=?*Y(2Q^_NG5Im7KT*{SK6>{?OM{~kC{5FW35Y#nNL#1?aU)E$k}F$ouM*u)9~w5V{5nq zMFLubjA2ROdYX#hIg&{gRU9D!kLj9=P1NJIjfL9C9k5s|XBqb5nth02c=vM&jpK(@ zjJFvHAFv*^krDGOofU!HIW5%H%a^#i`Pp7Lq$HKV!Cu+-t9Ev>Lb1kp81?8VZ$UDY zX*H;h2*xLrD2#)G272@StD&*8dsF93!KR(E?Tmc@sP2;5CxxJigK$iZgT-p1hFC)t zSr`W(4uhpT+;&K{XOec2lYyL7d$1o;JP^S^7_9`4_unZSd;8UE$jG{k?!h66KD^gr zR*9r%E9 z8m}ka>wpJ(Vr46dh$jS5P+S#NF2n#jQB4Trf8iC5$(CEl{KKAAPXPP+(iifZ%ePfk z0~p5@((6)YcFT>uaa_&x*6`r73=`J9RjJ1$ku%(4FrRpyymYMT=VIPmeDx&YVwt*2 zrvPCP_xAR!OKmkjhy=a7aWBgY|6C)$m}V_JPm825-#q?b4f4+G!QvnRNDrC&Bzk%{6YI2rf# z{A#7Yop=)7)TB|9gC;ix9sZ`ap|FPDeW)WNZePsgzB|#NU9%imUS7Kv2qH(?Vn-i0 z;wxQB*g!C_!UxKW7aK)aH)qRRYXBY8Da z^N%**`7n`?26s2%{c5$%@U?@65vQO%{rzhu^IIsc5VVK;%yWZFVd2ZIS<>%RxGNDk zSh{AO!oOj#UQMc86oNS#KKRB3be4K$rMt&8%B>=u%EWxDQ;4i|+a?PdM5;P31fTJ) zcU09L>ftS+;Wp*4PC2E%!&+`@YF;2!%vSG~qAIW9|NuVN2A!>v+Q6L%eHXKw&wft+Qt$v@#$?k`IzjUCo9_{qr6 zpa4~Od9_!046g(o6b>*d*<^~|JhF~~U4}`ca3M=aWpA{(1C;?!QSV7C!DEaGHb$7p z9sQ4`GV<*Cc#Lt-^v-LYyq$nS<`V7C)K^UmE1s;zbvblJ-BVF}ndSZARTwIX)Bgb1 zSghctWQ!mkGIB;~LK5e9$i#indBs}O^n0yV;y7(!GP@k-vVq-=dZ|K$JdSnECTeIl zo_?m&N>!wZH$;VUr1a@to1oh=>CwiKss%qbIuo4aeszbUcy28%u+AE0!F{8Trh3{ zh2&$Yss>paC0*Pz4h9G3Tn9mZTi@R9D9V`UXyBU9a?>lw#3(1_j1%&YT1RwgoU?`s zakO)T?e9)$qlz#Ylg&QB5lCd@q)@7o2^h{jYZmq=xtc=6V;CTgzvtSugFNy9uquJ` z5;~frJV=bd1HruqYSynQ_K2AV zXa$JRuS(|kD7A8M00045(p$1)+?p8?f}lA)0LOZ_G@B#GQsZvlKuu#SvKYeTbJnlB zl42*Ga0uzZLqDkZ!To>jN{9-LP- zMS0lG{6|@AM2v&JPJXpd#16i6aU(8v;q#tHrB9`?mQ;SlbDqcl0IylPi$C_Y&Q4W8 zHOlrO>_H={UB-$A&_;4U8ckl{poT>XPnopy*wtM|W`f|l02m${uq0MytvgL)Wf3@e zU*>P1{{ZXO-p=hBC8dcxK_lH?X>h3dcJA6U_p{cdM*Dw>*~6Agc=oP+K<1&pX8zZ= z;aQ@$3ZZ)pai4l!6p(MHkmQk$I%c{#c~H`^w{5v1GYoH2{LOR`DR6~{%zD-cZ!b($ z>heej1E>|f=Zi}=na1srf=9h_TIh(EWlh%QTcIG-VexSjHwe6+Ls9A1Z>T}NkS^BX zXE~&~m&m-5T>R0fD5UZERLNP5o7=py+ZeKwouZ>We(p#Z;MSmK z^3{(dj05XRMWY`20d;y8Bp@F+9qP<+ZkYsMG(`&@Jv&q3jfKPR7$oHLTCu=e#l3mWy{% z+||c)7S!HRhfq3g;-7g2Y~z@&OlK#)0i^&mtO4K*3bfMgRg3^fLtV(!&w#0LPu)J1 zZXkTavmt%!FU&AqG$*mh_sweCNU{zH$P^5pXx&P4pK4HfrQ7niJWwzLwJe`?&rAvv z)S5{K_+$gFIG_rnmFJ2^`AFlfE`Cu=lz$a8A+Fg|z}r=2V(u~e)Uut+gdJ+7%dk?Y zq_=uvWp|IxxKQ8f)a0!cFg{i~4yOmL6og^w=_U?N2?PQMOxH0cojW0tOwG5TBLM#Z z_3O6Oq=>rhT;X%V``0~pGpQmzcRo%>MXy>r9I{%Kt!>f?cNWe^S3h^yQ`-4UI>fk9 z)!6?4oYgyvl~z9?X7xA~Qrt^)p-5mH{{RQxZ|V5e5q`w7NhG%`6j_#cCum-y{3`9f zjw5i_4ziK=V;S1Kbw0In2$seyoI?;(lw1}*xjju#n^}9Q{Eaya6+bkL08l=(0ea@) zH2YOoDy4W-QNbTh^+*{m%C*5T!nxXmh9lq7pms|zWSPYGEOC}SKi%}KYrR@&q%jQd zknKcM$@Ungku926nv8J9w(tO4@FIv{AFrvbvmN%KKa+18NW&Qb{Hgx&{{RZn(|k8` zFO@#0x){cORd1Z1ax0>5vRFhC7}hi^kVj6RnW5XDD7U$trTBIWNQ9F9{^WewBjr=< zD&5|ymgGkU9&Y2PTF$-H%&1~Vbd9-fyc6y0DvX=tc1S~^JnsrKMTdKAOFXj5tt5

      Z58AE&w17 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�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�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 diff --git a/readium/navigators/web/scripts/OEBPS/page11.jpg b/readium/navigators/web/scripts/OEBPS/page11.jpg deleted file mode 100644 index 7e592f37e2920f4a32dac273539924ae1438a94a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67998 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

      S-zZpc^35c8Nbm~{$@ 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 NFngcpMHEv5|Jh&t)HeVC diff --git a/readium/navigators/web/scripts/OEBPS/page13.jpg b/readium/navigators/web/scripts/OEBPS/page13.jpg deleted file mode 100644 index b18e6259004771234dee84869484b1088d68f8c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52612 zcmbT7Wl&tf*X9QuEVwiH5S-vJI3&2c1{)*{5@2w53+_$`t_i^*A@~5n-2)5~G{K!L z|97|Et=dn!+qdqg+jXmd)qPLj=Q*eUE&kg85UMCBD*#YXPym+C7vSFt;57gX6BCGu zfdvEtv9Ymm@JL_a;o{;^5t9&*(o)mY(Ncpz3}7Bs1|}|M5Qt5Lor{-GP*9Mb6(T9h zFTo=q$p4?0pkQNTbhMW%7DS369FT*StMlp5fg?~7gWti%&6Z~*p+`6PT;l)v0=$F_A>_2^eb ze-b*{6vr@oWdBKcf>L$Ydt}%UI6=(kD9|!hVMZ*5p8mAHXlg-4-n@2hD(|+_i}6%5699A zxFd=X^!HwrOg-`Coh>!c=J@8K_|PO*8srI+lyO%?YyYfXK)mBM0dlWG;tRy}%mzT9 za60Z{BU}1`q^#5G1e=R@8hMK1&Ots@=t%VZAbl&IS$hxIErjZK#d2|8UzThACam9! zuO(Qegr#<}b$pr~7;+%*aPn11QHF;*`@}%PG7^DWcUw8N!#~mozz}sFZ?;B-u2) zhv8H{JNk%&C{w3D{Jw8cDt)kUQ`Xq5%L2z0fOY^=EHK6*#=9CSJ)irFTSKitq*fr^rj?>a`R`O^f!s7+tgZ(f*W%Mr>t7RVWd5?9I;VG>c+ zB6cD>rDc<*6ATkj5N1nwjXXJh^3%^u{KeP`ZJETBY8qAiDp^bM0wL9OfvR0K4rN4< z)6~I~H-4+kLIak!qy5!Zdp7e$oJAf)J1SyV)Ukubm$Cm7ALc~yD)s?!YZ<@orIEf# z!;8M6ptKi3miJifiSy!@u;wpx`?K-{ot-o%*VLu^@!mx3HR>X}1Q7j8CQVu~-MQBy zLk&D)p>czbou7O|lOFIuvth~_s!CVO_5kY7=7T!*&N;3N(=Sos8*Z`$M?fm zRntCtQETxYK*3t^T;z!CbqMREE;3Q7+Q`1^C@4eur2<6j+r@zL?vaju;>l8(b-jfW zl$mj{=(=j%1e)n0dC2uvrEM6(Iuj=`Oxuyl?w+_Cs*e%Eqv`Tajzn4*o32^5pl2uM zZkmb)u$`|x!ef2=-3B)mQaSjsmM{K(4wGl%EDCz8Cgr|&?W`^j(*2h$QIVcIa7SCQGVzB9 zW}V~~@{dmA3mhFE^Ow*abq3n-5P7YRzh#s0x29m)Zc(A{w1>g|abI%teNnn~C#fOj zkv~bI^WJnOaZ8qd4E9w}+}EF9XK}*h=&N-3^qozE7iTXwYHXGnH-o^6uieJo#AnI<36{TU1-!pi#=3(8z3S^u=cfWFES|D zq*-uy$IiHbTFxeo83LM_t*OMgH4pJ96H}E#@QI=|el~GP6cqJ|+hYxXIEb`U)5UFq z=wATS#&EH{wJhQZA-lzkk)hg*wBM`sQ^5gW`CZi+qnKjDj`r^NQnafPgm7x#y8N9e zNR|3pC4x#)c0h0(OqB?PPg-g*$@~yk2@i-b2_K@H<%8h$+u(k_6>WPsLqOJ2tbBGTx?XY@&jU{qF_GKfobX!=Qjktf0%1G79*7Oi7uw zPEjIyC_d>(sRslWB}!^_78y1-$p!Ed7t z#$nsFvMwhT8Hpn(22uMMjj)qXK5>TYMJ|k`#d|<%IHpva>?`C51dqTN{YJJnxU zC8#57FV^~m$5M_B1Y_d*ossDImA7_9Z^mIj#3O+I2�PiR;5c&#OY;wDmOso&FLC3A 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 UqKc#t?1f&t^knS#N>Hh(* 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 z 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

      1Fp&iK^w|=gGr!ITOx5SJH6@3 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

      qDV9%VQ5yk#vBmX3e>iaflqK{{U%^Z~nDa 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 diff --git a/readium/navigators/web/scripts/OEBPS/page20.jpg b/readium/navigators/web/scripts/OEBPS/page20.jpg deleted file mode 100644 index 19be7e4d3e357bc2c18b31f0fcae955e6226d770..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36500 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%0DvWLkc?FX2pO3E?LLw6qC>**&_Yv5Nrig1L! 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

      T(XDqV2Hs`?zuDeKKT%0;k*t>% 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 N!xnj>iYs9=|JlAGGdchO diff --git a/readium/navigators/web/scripts/OEBPS/styles.css b/readium/navigators/web/scripts/OEBPS/styles.css deleted file mode 100644 index 58cd9792de..0000000000 --- a/readium/navigators/web/scripts/OEBPS/styles.css +++ /dev/null @@ -1,185 +0,0 @@ -body {color:black;margin:0;width:750px;height:1000px;font-family:Times New Roman,Georgia,Arial;font-size:32px;} - -.dedication {position:absolute;top:180px;left:75px;width:600px;color:black;font-size:30px;font-family:Times New Roman, serif;text-align:center;} -.rights {position:absolute;top:450px;left:75px;width:600px;color:black;font-size:20px;font-family:Times New Roman, serif;text-align:left;} -.copyright {position:absolute;top:945px;left:75px;width:600px;color:black;font-size:18px;text-align:center;} - -.books {margin:10px 0px;color:#6F6067;font-size:20px;background-color:#fffff0;} -.books img {clear:both;float:left;margin:0 25px 40px 25px;border:thin #6F6067 solid;} -.books p {margin:0 45px 0 0;text-align:justify;} - -.red {color:red;} -.orange {color:orange;} -.yellow {color:gold;} -.green {color:lime;} -.blue {color:blue;} -.indigo {color:indigo;} -.violet {color:purple;} -.fuchsia {color:fuchsia;} - -#ul {position:absolute;top:60px;left:75px;width:267px;} -#ll {position:absolute;top:657px;left:75px;width:267px;} -#ur {position:absolute;top:60px;left:408px;width:267px;} -#lr {position:absolute;top:657px;left:408px;width:267px;} - -#ml {position:absolute;top:495px;left:75px;-webkit-transform:translate(-198px,-19px) rotate(90deg) scale(0.72);transform:translate(-198px,-19px) rotate(90deg) scale(0.72);} -#mr {position:absolute;top:495px;left:75px;-webkit-transform:translate(356px,-19px) rotate(270deg) scale(0.72);transform:translate(356px,-19px) rotate(270deg) scale(0.72);} -#pic0 {position:absolute;top:180px;left:116px;width:518px;border:0px #cccccc solid;} - -#um {position:absolute;top:900px;left:154px;} -#bm {position:absolute;top:60px;left:154px;} -#pic {position:absolute;top:110px;left:74px;width:600px;border:2px #cccccc solid;border-radius:0px;} - -#pic151 {position:absolute;top:110px;left:85px;width:287px;} -#pic152 {position:absolute;top:380px;left:85px;width:287px;} -#pic153 {position:absolute;top:630px;left:97px;width:263px;} -#pic16 {position:absolute;top:110px;left:75px;width:600px;} -#pic21 {position:absolute;top:110px;left:75px;width:600px;} - -#b0-1 {position:absolute;top:110px;left:75px;width:600px;text-align:center;font-size:54px;} -#b0-2 {position:absolute;top:600px;left:75px;width:600px;text-align:center;} -#b0-3 {position:absolute;top:730px;left:75px;width:600px;text-align:center;} -#b0-4 {position:absolute;top:870px;left:75px;width:600px;text-align:center;font-size:20px;} - -#b1-1 {position:absolute;top:630px;left:75px;width:560px;padding-left:40px;text-align:left;} -#b1-2 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} -#b1-3 {position:absolute;top:790px;left:75px;width:560px;padding-right:40px;text-align:right;} - -#b2-1 {position:absolute;top:630px;left:75px;width:600px;text-align:center;} -#b2-2 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} -#b2-3 {position:absolute;top:790px;left:75px;width:600px;text-align:center;} - -#b3-1 {position:absolute;top:590px;left:75px;width:600px;text-align:center;} -#b3-2 {position:absolute;top:650px;left:75px;width:600px;text-align:center;} -#b3-3 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} -#b3-4 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} -#b3-5 {position:absolute;top:830px;left:75px;width:600px;text-align:center;} - -#b4-1 {position:absolute;top:590px;left:75px;width:600px;text-align:center;} -#b4-2 {position:absolute;top:720px;left:275px;} -#b4-3 {position:absolute;top:685px;left:75px;width:600px;text-align:center;} -#b4-4 {position:absolute;top:650px;left:440px;} -#b4-5 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} -#b4-6 {position:absolute;top:830px;left:75px;width:600px;text-align:center;} - -#b5-1 {position:absolute;top:620px;left:75px;width:600px;text-align:center;} -#b5-2 {position:absolute;top:680px;left:75px;width:600px;text-align:center;} -#b5-3 {position:absolute;top:740px;left:75px;width:600px;text-align:center;} -#b5-4 {position:absolute;top:800px;left:75px;width:600px;text-align:center;} - -#b6-1 {position:absolute;top:620px;left:75px;width:600px;text-align:center;} -#b6-2 {position:absolute;top:680px;left:75px;width:600px;text-align:center;} -#b6-3 {position:absolute;top:740px;left:75px;width:600px;text-align:center;} -#b6-4 {position:absolute;top:800px;left:75px;width:600px;text-align:center;} - -#b7-1 {position:absolute;top:570px;left:75px;width:600px;text-align:center;} -#b7-2 {position:absolute;top:630px;left:75px;width:600px;text-align:center;color:purple;} -#b7-3 {position:absolute;top:690px;left:75px;width:600px;text-align:center;color:skyblue;} -#b7-4 {position:absolute;top:750px;left:75px;width:600px;text-align:center;color:seagreen;} -#b7-5 {position:absolute;top:810px;left:75px;width:600px;text-align:center;color:silver;} -#b7-6 {position:absolute;top:870px;left:75px;width:600px;text-align:center;color:red;} - -#b8-1 {position:absolute;top:570px;left:75px;width:600px;text-align:center;color:lime;} -#b8-2 {position:absolute;top:630px;left:75px;width:600px;text-align:center;color:blue;} -#b8-3 {position:absolute;top:690px;left:75px;width:600px;text-align:center;color:gold;} -#b8-4 {position:absolute;top:750px;left:75px;width:600px;text-align:center;color:turquoise;} -#b8-5 {position:absolute;top:810px;left:75px;width:600px;text-align:center;} -#b8-6 {position:absolute;top:870px;left:75px;width:600px;text-align:center;} - -#b9-1 {position:absolute;top:570px;left:75px;width:600px;text-align:center;} -#b9-2 {position:absolute;top:610px;left:75px;width:600px;text-align:center;} -#b9-3 {position:absolute;top:650px;left:75px;width:600px;text-align:center;} -#b9-4 {position:absolute;top:690px;left:75px;width:600px;text-align:center;} -#b9-5 {position:absolute;top:730px;left:75px;width:600px;text-align:center;} -#b9-6 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} -#b9-7 {position:absolute;top:810px;left:75px;width:600px;text-align:center;} -#b9-8 {position:absolute;top:850px;left:75px;width:600px;text-align:center;} - -#b10-1 {position:absolute;top:590px;left:75px;width:600px;text-align:center;} -#b10-2 {position:absolute;top:650px;left:75px;width:600px;text-align:center;} -#b10-3 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} -#b10-4 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} -#b10-5 {position:absolute;top:830px;left:75px;width:600px;text-align:center;} - -#b11-1 {position:absolute;top:630px;left:210px;} -#b11-2 {position:absolute;top:680px;left:75px;width:600px;text-align:center;} -#b11-3 {position:absolute;top:730px;left:460px;} -#b11-4 {position:absolute;top:800px;left:75px;width:600px;text-align:center;} - -#b12-1 {position:absolute;top:590px;left:75px;width:600px;text-align:center;} -#b12-2 {position:absolute;top:650px;left:75px;width:600px;text-align:center;} -#b12-3 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} -#b12-4 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} -#b12-5 {position:absolute;top:830px;left:75px;width:600px;text-align:center;} - -#b13-1 {position:absolute;top:650px;left:75px;width:600px;text-align:center;} -#b13-2 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} -#b13-3 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} - -#b14-1 {position:absolute;top:590px;left:75px;width:600px;text-align:center;} -#b14-2 {position:absolute;top:650px;left:75px;width:600px;text-align:center;} -#b14-3 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} -#b14-4 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} -#b14-5 {position:absolute;top:830px;left:75px;width:600px;text-align:center;} - -#b15-1 {position:absolute;top:150px;left:375px;width:300px;text-align:center;} -#b15-2 {position:absolute;top:200px;left:375px;width:300px;text-align:center;} -#b15-3 {position:absolute;top:250px;left:375px;width:300px;text-align:center;} -#b15-4 {position:absolute;top:430px;left:375px;width:300px;text-align:center;} -#b15-5 {position:absolute;top:480px;left:375px;width:300px;text-align:center;} -#b15-6 {position:absolute;top:655px;left:375px;width:300px;text-align:center;} -#b15-7 {position:absolute;top:705px;left:375px;width:300px;text-align:center;} -#b15-8 {position:absolute;top:755px;left:375px;width:300px;text-align:center;} -#b15-9 {position:absolute;top:805px;left:375px;width:300px;text-align:center;} - -#b16-1 {position:absolute;top:600px;left:75px;width:600px;text-align:center;} -#b16-2 {position:absolute;top:730px;left:275px;} -#b16-3 {position:absolute;top:695px;left:75px;width:600px;text-align:center;} -#b16-4 {position:absolute;top:660px;left:440px;} -#b16-5 {position:absolute;top:800px;left:75px;width:600px;text-align:center;} - -#b17-1 {position:absolute;top:580px;left:75px;width:600px;text-align:center;} -#b17-2 {position:absolute;top:625px;left:75px;width:600px;text-align:center;} -#b17-3 {position:absolute;top:670px;left:75px;width:600px;text-align:center;} -#b17-4 {position:absolute;top:715px;left:75px;width:600px;text-align:center;} -#b17-5 {position:absolute;top:760px;left:75px;width:600px;text-align:center;} -#b17-6 {position:absolute;top:805px;left:75px;width:600px;text-align:center;} -#b17-7 {position:absolute;top:850px;left:75px;width:600px;text-align:center;} - -#b18-1 {position:absolute;top:590px;left:75px;width:600px;text-align:center;} -#b18-2 {position:absolute;top:650px;left:75px;width:600px;text-align:center;} -#b18-3 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} -#b18-4 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} -#b18-5 {position:absolute;top:830px;left:75px;width:600px;text-align:center;} - -#b19-1 {position:absolute;top:590px;left:75px;width:600px;text-align:center;} -#b19-2 {position:absolute;top:650px;left:75px;width:600px;text-align:center;} -#b19-3 {position:absolute;top:710px;left:75px;width:600px;text-align:center;} -#b19-4 {position:absolute;top:770px;left:75px;width:600px;text-align:center;} -#b19-5 {position:absolute;top:830px;left:75px;width:600px;text-align:center;} - -#b20-1 {position:absolute;top:620px;left:75px;width:600px;text-align:center;} -#b20-2 {position:absolute;top:680px;left:75px;width:600px;text-align:center;} -#b20-3 {position:absolute;top:740px;left:75px;width:600px;text-align:center;} -#b20-4 {position:absolute;top:800px;left:75px;width:600px;text-align:center;} - -#b21-1 {position:absolute;top:350px;left:75px;width:600px;text-align:center;} -#b21-2 {position:absolute;top:400px;left:75px;width:600px;text-align:center;color:purple;} -#b21-3 {position:absolute;top:445px;left:75px;width:600px;text-align:center;color:skyblue;} -#b21-4 {position:absolute;top:490px;left:75px;width:600px;text-align:center;color:seagreen;} -#b21-5 {position:absolute;top:535px;left:75px;width:600px;text-align:center;color:silver;} -#b21-6 {position:absolute;top:580px;left:75px;width:600px;text-align:center;color:red;} -#b21-7 {position:absolute;top:625px;left:75px;width:600px;text-align:center;color:lime;} -#b21-8 {position:absolute;top:670px;left:75px;width:600px;text-align:center;color:blue;} -#b21-9 {position:absolute;top:715px;left:75px;width:600px;text-align:center;color:gold;} -#b21-10 {position:absolute;top:760px;left:75px;width:600px;text-align:center;color:turquoise;} -#b21-11 {position:absolute;top:805px;left:75px;width:600px;text-align:center;} -#b21-12 {position:absolute;top:850px;left:75px;width:600px;text-align:center;} - -#b22-1 {position:absolute;top:620px;left:75px;width:600px;text-align:center;} -#b22-2 {position:absolute;top:680px;left:75px;width:600px;text-align:center;} -#b22-3 {position:absolute;top:740px;left:75px;width:600px;text-align:center;} -#b22-4 {position:absolute;top:800px;left:75px;width:600px;text-align:center;} - -a:visited, a:link {text-decoration:none;color:blue;} -a:hover {text-decoration:none;color:red} diff --git a/readium/navigators/web/scripts/OEBPS/toc.xhtml b/readium/navigators/web/scripts/OEBPS/toc.xhtml deleted file mode 100644 index 8f0cafa1bf..0000000000 --- a/readium/navigators/web/scripts/OEBPS/toc.xhtml +++ /dev/null @@ -1 +0,0 @@ - Bella The Dragon - Original Edition

      \ No newline at end of file diff --git a/readium/navigators/web/scripts/OEBPS/ul.png b/readium/navigators/web/scripts/OEBPS/ul.png deleted file mode 100644 index d2aa069267e98a63dee44f91c157349d2bf4dc9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56405 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�Y!F@W4-41?z;2u52DT)5-+NQztaSs+_(Gb+KUe- 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

      6^kCayH^r9Ia^WV)4Y8DO))7U*0=CE6 z!mePVv-pcrd}!5T0Fw4%egz^a5X2N=ZtM7rluL;rk#i{oW~!mp5GC1>A%luRJC=9> z8GP7z^Se*Yt;0h#dFJ~)-{-t{EB9{)s$T0pF?;a%s?MsNSITovEqlj|+i%z7jVIuY zS1c*cn6<3_czscJ0T3f689&+K3Q9g~79#36HF(D=Fe`(u@oqo@8N%kG^V;88TJcZC zBf1N18QeHfFCuk>b_bDgPjv%3yS@1}@L4yFA4WMW%}2JJT>7Sc05RER;Rr~2Z%QEIG^3L7 z5`taKQC3h#ptVKN*k9ssuSFw8Lo0s)fS>`mz&`S-HjVF&AA=s zUQPG8ZTmicrKk9xZ{+{*PQi!wOMmmQI%BXV@5auYg9~0a;|~&cfs;y}#M2b=UZTd6 z%f{XghmmkfO8_P55 zSN(pl^q1{ruin`8VSB;9cN|(caHg8Bdza6Lv`-4TO;;?SUjoHJvhqX$D0q z8=rwmX&C4#?_Bz;Q}yRbBt`H>o)XeUjKmz;;CX>7N=#anN;*mm?6O>vOMYQF@;asH zNCZQ?k)?TJfUxZyB|SvbUe~jS=)*0=TTIhFGjz_h9XY&s#=RXcbXUIIfB4ngyI;Ov zIs?eRTvY-5W3u}->d>d?VT#2(~A}DW?iRnd~fG~!Bp1zoBL!F=-Qw1P)V6%!o=SB zLe)^pI5kxwFlJ4voYL~3v%M@>bSws9$S9%*GiRNUe#s>0)|5Mq+x@N|o#*WUM(YWr@ zYu|iyBm1MOMX!~;`tzz!elv7r*1-9t!{_G?)xObneA&RUl553TJ74+nu!kY2ul7lI zy{W*^(>6mn9E@+~NFz#)H~mcZ=tR;gC~h8Dkmdx$h0O?11N)_ZeOj^;cdsa&edIGn zm{0{nU?i>2bYt4IMAjDM()jS`(~;rs_vh3v{r4wL%SIc&89cwd>p*tHzO{#D z{%)k>=5&VW$irf#-~d;71=5bdp29~?x=6*RUtragZOM22)46DQ@&1l_4_^3B-6UQR z<4Tf5eoRVw(04U8jd9Z01>_%$mvlW6@yfgsX_a~#zlbOOz_)P0R(iFLn$Ca)(vIn| zzr!&@{6PJw8LuxYYh3nbSIMTH{X54_WW|mb4CSw`{@sk41ph^cw3r=7qj09^M8&G_w$1$bWNp(q@D4iO@rnf`0pxZy$ zt%`Wm9*6wJy@luBd-vYe*1zY_~6J&ItegH8F!Sj;}foho~?4l>#-7%CQk$7T5PZMJjO1s>Q3_Uo$ z_{)X`vj_Jrn>bxOcBFW?Aoue8cZ&YsKMvMqJ-JeP^JwYe`7_Pa2gxprjpj`N6Lo5j zR4$ZVpzX0BlVBw63%K_J2!QJv1NB*o*jQ|szRZ`^ObMyB+W5&VhY- zy&D!D`PHv(WPaLHQ+ly*XVvF#*~{+<~OOVr2&s`rc@UYK&#OP&O0Aw_Ya>Inlzb}|yTC8Yy7 zQ>vE2L*?E?niMxOsnw8_5)4HRQHZKQW!pl3;`ZV4+e;TeDlHh=vtjtq=KEP0mA`&* z=v3kL{pFP({?RmMI>%7=j~gh-UEdS+X<v=cbCHUqX3$SDoD2g3XwB)ntn$d}$tb@xBZng2Tw;ZTx_xwCPGu zs=a~oY7NSPTWSJ68}x0zF~M3ZchXLsJB>h+j#x zGhf)ZyMOBjQ&BQnQE+X=qHRBVu6p^GXZ}3bjP^`Fm*ob6wgEIo)Oi<1^bo>rKM?B{ z&^XStk3Be-y>S=T`LIy1PI_|c&x@})2# z5-Mrzu8=CS%6a)iVW4NquGJWlhEP$1D6Fw`*eUU&N2aCu*13!fbFyr-Vqa_SS4BU2 zsdDbj%Xv$ZU;0!MFJ%H=gCJS1Foao4M^NGr8;jA`t}?Dls!tI{=Y@jfEst1@**10x zYk&e2$q|+*C1`F(C&_k**n_{%!ZBBf63FPQAC^dvn7 zC|*V?cNGrgt}sXUbrfto_u0Jc7k_!?i+4>7p28LH!jR9$1Art<)7&UYVypBmrH5D; z^u7A+w(`;?LP#ELPtgpsNSRVTCdgQtMySJ&Lntfk?`bqzFxOv-S6)UZ|YNe7os~ zFWlX=JbpenesudR&j~z>>WFRC^fy_#Qz+4w!l>+mmBB5HR0SAlSo;*ByMb*FYw#$D ztqt(f{4<=l>=|e%)6|kk)_F=|@b{JiL7t=8kXCCrlY<4&Vso^Uw>Ni zqo4O2+mh_EU}WY}dXV}HBuu?G795G3g^5LYtK$uFTzwMHv80MEJ%-E+y}aOBI;I^V zgtTcKR7jTFo8r5I=x%N%`<$5PmGtp*Y8ML%8vgB??h{dp75f-+^~pdy5rh4w^mM@=6_u z4p}=|$c zDw-jRxl&}scHCE3G1GBVCU{E*lz>LUJ^t21$rWyRvPFbL+mOQs25z^@QqaSSPk7eD zw}j?fyr3S8QJo>|goNUknD?Z#{r~8KriF_RajgLmM-oP+}+(JKyWME-3xa@kl^mFg}b{GJh($}3-0a^{N|kQ)6+fO-^@JR zm)iBb_xjgwD_luI3K;<(0SpWbSsEa&0tN=&_WM6A9K`QmSh-T>-w!AY5qS|Xu)0{p z7h`BJFog+eaS^qz1_PZIj(XbZ#hMlKZz@6L+@eop61IS+CW;m`{sMg~H&+i256|}E z3i?g#Iw)(7)|ce${$mT{rCWnG7GF+p}ut>%^=HWyVbZxxH4I`(p_zHbY-!#3Ka(v-wPWN#E?$-AHA zNQ+61(iqiq519-BWPt0_Q>kh-M=e(N*&I@pz!@y1VvJ5SyckZZhHyd@3fD*KDJC-R zht-SJ+k_$coMI+qJCqaJjOi?xmkNX7mXtnf1-#>Urg=tdVZLKn9wKpM=8P-X*UNBB z;KI%eMw=EfA*$(kNXOi2mR;SI2c!)!ccOeAPB*8EvGK0SvmhRR$uH2#t$3kjc?DKV zkrL8`s#$}5V$>3uO>1^c6bBfXPfxcz;};mDFBIS9pS(OGA_vQ3gIM1W-3pCb3Blkzv^?I>PijsX5q0E;eNO!ngShk08^M;JI-h)7DO|=4vVF zYC@@M<_L~P9!5%ZMF9)SW+@aKvpQ1_#3=Sk_tA_>vON5s_)@CTRZ)6&g-K7Q0~2k@ z;-|v`ae5!`m_KW=I!V_K)~L%u0;LFoxm>Nd1;=)OL`J8;45_`9vN>p05&?a&9qYa; z1cOA(rH=bK6&SREW)1Hw_oNyMOka4woR$)7mWPmaxa@5Gzpx`6t$3gei~JgPu94xG zea$_trgYO9HxFbZ{G>uz>|=Kb#5Q1%y@|D@E_o|)vFOrt;wbsK+bg5_9@q8$|nZhn}Xj zEFS$vCY z<|n+ydBh$)803ma;l;rvdl8e0>Qb%DMB2R+yjO_?TB$mAbyb9V)%gpc!Akw~`6y^I zJVEx#8x4A;Zk$?n?Y-xSSqB6V;Z}4p_fjLc^@*}d&q<;>ejPfvxu%7_hHD+t^m{kG zQn1n+Z7g6JA6?C+L9MfLC*xdqBA~csIH#lNE7qm)B6F-7G;&hUSpWFCPdouh@}SM# zDwl(GeYD)Tv!Z=&fwKx87>RW6RZWMEHExfyaBI?4V?ve`_p=p3ONWn^1IWCECWY&Z zX&$nlY@=DaH6F*Bed!mwR%h)RU9mBqV_KR7Le@?YQz(1%#uFWqDR))+k&*-FFU3_h zZPFwhHII8ozwZ^A$B~ZbgsbcaI3@BRH}xaEXrZ2nRTzg99vKb zxpY)vD7_^9xI#ebOrkDX@Ebw6%tW=Gu6CY}o0XsBWNFRM{o|*F7;MN`imJ;Jt~jJ$ zR^IZSMB3&8>`$-hKC~yWZ0*pjgq%t0HH2yH$viP;b!v}E585W=PujbM#mzSN1o$uo zz6I=fMsuEtcW}BJ*TYMU7fdmy_O0N4_GH*uZOO=V9t6!w<*4QL3%`<__3G zmuD&MicF5()KhR=!$X3-Tk0Dq64{%W##D8eei1e^;?dqol7a6V8{(*@^UmO4R^6?a zq-;?{+AmNgyOFqiE;=JCNue~5L9T8%+wr5L&c-o1PjgJ9bA6Y=AH#)$5TOn;Go*$= zEBmLMn}*JKi%>pihNm^N$u~JMnVBx!^bq$Q^ZQ!AM#fNz(rpga}KV~38oFoT0ZJN_GX0%WkP~q4` z7(<7}nOr)wBs}1hN|X=-)TPU^%F3#XIB+M$lS2>pOjrra5YORHhSaD8XGY~yD%Ow{ z27P<))WVw(6spvo_{zNIy87m5&4dxyt=K|5Z>{A7y3`MXxV2eIVv*l1M`f;1pe){eU2;!2!)hjsBU}E0>fo(ipKGf z8qCuSeLGv`+!*>HsI8AtvYS-9z@nkcsAx(s~D=59cg)-@d_pKlJ$v>55CY}I1U~t!VWjIJDNhX)!NRT-UDTf0LSRJl+YJ2o66Y`82V1LG}*25|&NZD~vqxM&1@EzrUDpo7r< zc4p!VFJP+@_%$gSABy5B!y7 z@AXoIbYG=Ec7pIeNpRPCL3pMX5g!>YBxzM`Jq0TX)%)mAS7_FdlZ!iCld%Y#EK2ZR z8}FntBNdZrCx$I^n@d~LM&uRfble3es?WxnyQA8uxr#sDkCed`A5{7D6$NM_C&>upR7bRy*iz9Aa)Ps0L$&)AX^YH~iOzh49;M=DL{L`ga8oSB2qPpzu(YZq zY>DU1*VEMpjDn@MX&1P$SJ@Me4clT4pd)!>`Q96V1Kqsi^4V6y`p0jv)s$W3M&@Zu z%PeW1ck%6;DR23%L3dKrRAa^-;ZhsZwZmV69{^nV_meQO&4kGT5)=87vxw?Ia_t_Q zx~}^1FWsme>WF^J%psR36otzlkz2K@vj&48za`mZT#Jyz(htSktvA_Z(w>Gw-iDvJI|Q*xIwns@>|mPH9}uJOqtFVk71^n^U`l&9xZ<_G!XS2yAoH z%3CLEIk+8Kgw*DQ)?QO*QBtROpH3zw1vmYZs-slvMj0=VWm|%==D`984IeAD59)n5 z8&XUo8U&%uERI!TWHh=Lm0H3%)6cC9IRs}o%^+336;hS?;wkx->Gb({xH6C4(<>Sf z+H$B{9|Kc-P*u%!u-1LZYl`ll-qwU2ND~lCj4@2L%GDv0cL?BTlTZMA^r;m(s%^MfKm;Ajlkybk`zOQT7D%X&DqJCHn2b+AlLe5YFv54&h zXgTro@|>t~k~eLc?0%YjRI2IQ!j0t2nvse%6jpZTWNrB&vI5CeY@Ga5<$N)f!fp{u z5|z9<%o(x(u8cs-3>Nu55Edc(wz*u@smLAr%GlM)+q(F8W~bQjV0mmfd51MWL!rEd ztkd&Y7au_c=XFqHL7yanJ_uirI9}2O%us<+C>dGJ?Uhy&RK(J?ecsK$rKgoM+_8ACci~2B%H04t=0RfX{`I@Y(|a1+7d4s7*0$oc6gm0X8TgE z_AE6gLdEL+v%b!!0w_SH2Bt!M9f<-2IyR0^SuhJZ7E`!>E;ao^>E1e7M*Ztlub@B+ z9;3oaH_JXNI1TnG39qc2P(!)X0?*)N5lPI=I}MrH3NY(zNLrwB5^6j$jRSxvU1HRg zkwa1%8*8fhd4Q}4CwG!R6wL;1_=c^eq3XUc8MCCFNm5N$&eZPdLO$a_$706E9Yw?P zbxcGsAAI7r6J^j?I3#%^DGr&jVh;a}HoB~v*|KNgmOGE76Wp<{+?-yaL070@U}jb_ zEm*rmX+&p9lU{+o+@=BtT^Mc{T$vOZDnRaU`vn$_tjIfUnB|ymB~@Uo5v<)bz!Z7{ zNvWcv(515T&EjWcV4EjWef!o=Kx-?ZNVnyYdO=IESit}@)135?Oio{X&@4!ai@PxI z!2bmhGB$fD^JT#xh0+ z=&&GpHzwFcF)hhmo1Sil>{xd^pPf##FLXtulA&bOEi>@=Dyo_ z2*`M}_&9RqLZjgYKviHJUbT^YR??2j*7rbVOq2?r1cRo48;*rS4WNdN_v8FiMgd^9 zNJ+$ll5qDnKglV`XG*OUt=CeLU`7`$VOi`JSwE^-;Un0!DU=3};>#SmcvD7lGhHy7 zb>7XMRIS)*v3o$8mhTxeDkI~P>>oYI(_3)W8xz%nMPR?*Gn8A!wV114a8gFj_uftK zmK6srr|0fXHr~h4gqJAvdtJL>%ufvjMQX{Tt4@WYccrH)x4a|WTU-`URER?EsV3l! z(o&H|a7NIEz>JpMax=ZoVOsO1XD11lLnzH2bt+1$@#SXsBiNl$tQl^wo92~7EYnxS zC!1N0W)hItTq9i|IvX%d=r9gvY>mMOqcLT>esb^8MY%>pwv;r<`ndNI=5V|^-2+8- zYb2q}*`RY?dJz+sM{>G;5RxvXz=7F9y}yUf%>=@-)`iql z3%dyT8JQ6Jk092q0NOa1KZG{)2r1!iU|1Y_0H34W+ixt^b~G(2mdO1$HID-%VQF0u zKh2G|#o^2F7ULOuoPNk1x-klT^^bo&g1Sw3h(&!||Cm}!IZ&XiIXe>9sqsfydVE(-^!!)W#=^qoX(u}& zGv4|RHG1822&y5d@xK1b#*&(tE>mHdi;^N2E^2-aKV?oW zi3_WPn5c7jKIVHa!>i;-rT4Jf<3Mue3g;)RR_qO72M0H`dP`(1eluW;mjk){I8}|? z05|kcJOz}Wv@8bp*2I9QlPgEM_RlTco0&^7*pbHkvT^$&tC1J&vgG})2R_9Sj!`v2 z1PMd#PI^_$=;~=TE0c#fTCXe{$aJOFcu3Q>#U8j+`1K&?HcjGh4Q-9hD|{T&d_24# zg%;Qr^j3AyHWD*_VjdV|4UER~ENHKS41cIA{mju`0)e=eS3V8Bwvv#{$j{AkqBkIh zl*g3QiJiJE-p&hLX#F7`G0KGGNf zMn(!N?*C78ATQp&m!7L5hK7UA54KgCEG<2+)*P}YGOwl`VXRw@TixFFC$-JIrh{Kg2AAxIdqhm@^sTke>_IakiMQ1ELj&vb z_gm(!)3J_GZ6u+<#Rhq&URIC+H$La5!Qz9bLcxH2GphfYv7v@WaMjcU5h_Gp zx!rH`T@RBmkr3JOV}o-pQYssgUIMR?ati0xLa|t|NIai0`D)^n&;n;aB>kq1<3cl3 zPmkWQ5~_7~N|CPj5Du_$S*$VE` z7Vd#op?o22fBn3=gQ_S+KvirJG`Lv{G}d+AO+pT8SD*~8PDzoYf#&k`R1*;Dj^81x zrx?s$4c|7O=ExI>%xG#^M*9n|h5Ui6b3N8}sS-{j-%-5@nBHE+eS#u6rBjlmGjGAc zX~Cehz+l6`5WaySAA+Icf@1){vA=?AhbDN8{0e~{cMK@YPly|};lGvv8HfncyS`Jn zK&p0Aj-Aht>=h3a`#m5?l0)sI|%JxD6+AnJOY`DY58aD+*BX_6`z4ffsfx!!N^@VsdddsPJ}bT_&WDY8_%lhVwAMMXNz`etQL zUU&CWJT&{~DU-IKP|tZ~V4Ie$X+-c>4GA{F=2arL)T4CYgI;mhUL(C1z|XPh^3k(; z9R4%BRjkLVw>PrxH#4z0SYV%`ty%aTCK+(Zz{l|N#YtCT=4oNBXCzWi!-3FAv)Ue5 zZiMN9;N}8k5K{Sdao&{>;cOt!+n!OXV<2u}oD{v6t-No4IaC$=d%tg`m(@k}G>3(N zxYduQPKa}=Vm~$g*ln0Oe555obbc0zMSk_|(07$Ga(nykdbPMs#F0W-Gw_ENPZ~D(GWLG_b zo(J>HL&d!V6=1Hvw^Dmb2E6wV#GYa84xiCi2L8B39l5Ka0xsI zT?vji(x;BMG`*74FhAkYs&Sd6QIDc%=*kR!ygdK1#(KZi)<6y=#nBtN=bghIK7cz(%DN3EJB$`P z^=oP^4pPPnb_*On=C17wik9mt>U|$S+}%q-!oJScVY;*FDsLn%BdL15 zOBC@2Ps)?Evt(qL7`2hU+@M#)ksSagJ4uGs(bmP0nddJ&Q!o%`696uAhUM|X?lY!j zHs~wX7;2WQZw!Z9+0pO5&8~9nt!}iKzAD@DUBrY&Nc+~E(MjgG1-)$zWa;Wp)Sbv? z*)Uuqqipkn%NpFKCpmkV6o>mTt2Bo)6EkN3R|n)Grw@%P@TW0$#@}&4Rx0< z393@x4S(aFHlz*tB3{#H@c3|&T$17>L@fJk{ONgAE9Al2Yyc>s&{U-#oul7gVR9!H zT7C&Cc)jKqz{hamxAexg{vy7u_qe9DhK{v7;Brp9qwI6Cyfu~v9xXV!&j&nw4aMI3gM;m}mg z`rr;hQiT+4hKx>yLS%+gTV(-V@fjS|4?@^a0unatY1I$$haU=)-?EA+>#2LlbAC=@on?n z@5Te9nL*Hbd56zqX}Fwk&B8;=ZX=dlH|yUh~#wIN3^|}^RpQol4j1Ke0rM# z=2!ZUYP@^#69Q!2zO`NNy2{dMulAAV*I^;oJ(IHC5{m>F(M?SD`eH6U0?*TpMr>alnbOk@m5F zR3#KA-=j29>ghm8@`KOVl=c?~gcbs#p`;T{rPKPQNl^VnAt}!m{UF7`p!NJ_F6kS zJnfb0vt_S$m90f$D7&qmcOWA~)eaG?@|dAQ23HpMb2iKQ$kZa{kFy*!MXs>Do^kA*p zaRAF+7d*k#^;3|df6hnP6Bv8RNyCK}m_4F`B_vp^F|gFX`tPx6+&(KVkAEKt;4TGove)11ro z-7qvMIv`8_QcMz$C{tkbrwX>?$;z?$G>>)HvLk^q`>1HakrQL_&0${hjH^qpOeQtV z+u-mh$Lnz_tH-xV`{g&_qsuB^>Kaq?We+kSI*V-xB-|zd{W~ia76>&04h&_foQ&8t zR4r_roO<^^Ouny~lku3+&)3`)NhQBlwI*5Qk4W8$N5bBQ4SZ8u>6r))6$CUM=vrD7yXi{5DGnFDeU{I+bpg6kT&GIF)_UUM_4i(6wsofl`J`r3>0kPXH_VDV*v|rBy3JMsH;; z<3GS)q#wVk(#l?joEG&se@9q3kjB`;8|qG0W{iZ?>wT&p3vo42@&t z4I}T|{h_=3))ke47f33B1PVX@G!5d#xDdn!ZtUDRvQrduu>ot_Y{O->LIroN!d^7b z8+H+!9uvUIcF_4z%7^af=JdSX?S@oajzH`A{IZNm;R8UnWG0wI35&SHJKf68xwH#C zG*`Nl)4Hw8@4=%TS@-zU+Kc!ZXuo{De!LV#meMjmUid8Ef3$7==+U`-Yd%tz#+Va5 z+Gy}zf@L7IdituzxEcX1Rd-r;WqY2D+ttm#+c16J$#vSie7u_S+`-Y?^)zsk{j^yf zl9UoO2xsM9diuER5+rRiz0F)XYpdotI%+50s9>l9$9_(j@W zWg;>+W95Ks&1c1y|JCxeUgp|(gmRa`Fse0-g6DCrW#-1Rx6rb_9)i6DhAML#tbeMx$ z!10?~I_wCxev2YG8#x@lnNG6IKUGmCU251-YEl`zFnUfLT+}68f)adcEqpd6An1RW zkRD$jm zCKxVIF73qN6QM7K?#ab74Rk{N@FXHy3P+YlwHuU=iq$5nQ(A$Bi!Wv#J=6SyAVJLK zkF4!qYN?2TBaLN_R0)qZ>p&GRq;s5I{Aoufy)Qy!Qjln0Y4_DT)W0{2bxMxJfX~eqe z`1(sfG(-nCmifPJc9wJ{8b^%T#9f7`!IT{6jM|(eBp{yE+&>9mWx)gKq{cBLc@a`r zLQEPDat}lcWOa9g=h}rZH{Q%?M@^V{%nG_pTN;}84UAR{eGRWzd{u92y3<(7^lTWJ zUmP~d|dF^S7?G1M+6_;9*n(f8da=Ell`)32-Ys^%Dg( zOIWZj5DR)8Rdyq+wWhx@I<g29djsoSeq&z8G5Vlw|MyL>G>e=X%@?Otzs@kbm+ z+T&8e^&2Sv)fa8YZPD6xNad#t37@=a;SG+7+ci;0pn{r#km~khCELrMsmG~Yh(qXD z>otiWW1B1QWB;qiDuFys7qMeI54x=o@!ksd;X2kY$B(-UuF|E4@;HGk| zd=|+l>Ppk6@O?D4PgMBN5^J@VYrelpj?k8P8b6BKGWtmLx6T7N@IkUO268}Sun{G) zbAhA6^q`{qqY;as(}QDh_as7u$Dv5a~2Us~tAJxJX|;Kfbs% zRU1+pJUVj@={F9XyO^H442I<)u;~{}xAD7`aJaWHyR-~@3tsp9h~$sXM)6h_Jj=Ex zs)L_Ro+vnSSC!8~eC-2zTG{57b(R&d)ierL0G+>jxPG>GH?wlp9-ma4Vq#&k4Noge zt_w-I&fRqa{cb69CM4D}BfHyY(L4Fm=@zW}otm`haUvgq?`lsn6Y zt!24u&}>=B6Xc|(kYL)&*+n1Ao7sBghT;b=8V#1PWfS05zLpbuqQ$`F)mnT_Gc5CE z6Ib0Y;Y$9nqEO&f3~Dy;v`gy;_DyG6M*9wpMyR602SXf&4?&lx1a1SnTy>T#_Yecs zElc-kV{QY3s&!9t;~QwRCH=QnY@X5t7W{2X_SD`K(8p)XdX+oPh&{jQ!{3W{qQ z4v#W6Z{{Y~9#*#oh>?!>_P+jyj93Npo{49(E@pWaECZPW93T(v#!jmJ4jOhl>e20T zk|p)FmB?Ugwro0$QE}fV$M*)@S-ybA_-@2#?H$a<-F<5C)8Q6wiGN{k9eV79Q+Jvc=y7*w%*uzNrv+v^b5&mv zC0K~)Qa}LT$(#LlP^Gc6)CIfB0LZ7!2#TC`W{Yo}K-Qq-#2y*=T3ur6=80ma&y3uW z?sgQ~v9rMiEvUyVXD~UYH|&a?H6_)cA1TP2d?oZk{%ojc@N3-Vmko$*F*969PhaqW z8G=KqnwPn_Si$^fy22xne$9t%X9RG_V>hLcvi3^3u@6$dc)8G?He4{x&MXtGWB0N! zJDu@3c;ruQf7QzuT3>*0Ze407`^#OR*mb!m> znwQ#5MLijD_YA~R*ubp7-R5HZBERZfxrW-%3_NdkrRQ-Ik<-HnT;%4fsp8CDJ$>^i zdh6ATUlUJ11026f#xh)Oc!S)pw9;k={KH`TSZXFLTIG{B4i&%gr8}0r4Xh4KI!q1u zHYK}Q6>upy?^ZuxpSfa(`_D|=M>P#D-4$2P-v`X!zf2I@KQEj`FPyrhG(SFz`@CsS zH?cfXOtS31Sr_dSDKznIpCeJ3xjynfeDbXy+qeIyD_0yj0$|H#SQzU^I+z9@Gb28c zu5OT4n58q|$a}z0i!mRa^_qZ91vQYnbXYe;>{wslDMVp#-XJb?5p|cueyf||IMa{)2 zw&yi~|Dg`~C!s8&Op6SiFNYbKp!{)E3XQHvLFj%v7n5Ki|5FfT!AA@qj3Fqga@1BYr(<w)^VuygkQ9@goLT14-4!3nSJkr!&c6ZU(-l;7(x_Km&`_#uvi(sOx@^ zViOE_L~2=MQ#=BzV!8oz%{KjN#kjH9Vst=mU8It8Phh>44BCw)mvq$SSf&aaHq%q< zHZjvan@nuyf~;rNY2f68#c$&H+(x=7{&RU_e@$>1`_i_G+>@RkNPQ4mwL;J?zxBmE zT)u?_r^AB7c~SP)z~ak>1;cvh+)KkrK~5VoFU)u{jzdZtOUXvYNV6fp(^v3rwrKaA z6ZE(yC=KZ*aoy1G&>6+)Pj>M(JYaQ+Cv+qn@e2^RLj*t$^dq(t3 zi^a7sTgro*&Adb8-S?@9dE;M%Qnig^aJI^vf%>={E4_ zAaJiBa1EV~V^Aami!`I$D!Dalnv)#vG#no0!?H(<(r@23LnrJHGG3>gyS}QNUVl2+ zdVP6rp2+r@Z)R47K9ZGg5!d&_-ENPQ&Sz5M7dhX9{elIgHM2a#z`%3GuLEQ4SAor_X8XH-&f8PF4{faQQj%1R55sGyHYKWh*E zIG|H{{>|eBZ2E@)HyC4D7*j163k17-d^?q5YOr2XTv2k?UJ8IHl~FJCuQss%A#g(G z%sm;0l>82*@?U{d2^404lM?3N@}_)K%$RFsaT#e5I);Iwe#~?yRcDzG;JM(YKWL}F zz29>}=%&8P*D^K8WRo1_r^8Hbi#$j!X0^yKb z$@mIG!Q#n);t6o7i8SOA<#5=`y#G6abD&22R^+K4u!GQyrBcxsf<%l}Q?XKl zKN}mS;%bEC8QY{1V24f{yQLB@gn}Pe!;D_gSkfFV6+QL#+)oak&h;;eyIVakn?#CC z=6}>Sr8?c~)Pr}?p1L$dc1yi$oBjG4ni=b>>w0q5G)dFG=6^D;Ns}OW>ia0IxjW!r z8rfjBh;!4G9`igO_Tal=bhDwR|C-ZK^IlS%%kn%M!=h%8QPbL_cB9lzKfZ`kEH>br zc~8S6nb;2uPo>3Fg$BCj{KQz!KWoK}K;yUqj_NXAz9!R7W6+uh3{Xqm59Ey zUcXkiK)$Cj%}4OB<*$!8uWZe#yqe}aU52z>EjrhZ4P-h<%|JYU@8pcNy$m9(RiYvr zmsZ^giToP5D6WWXbT+Nu$>zX$Q0fWRED^9#<2E_$%6wY4Z9cP&2LRvZs;f$!nBDX! zSku(ahkwM5x3{w6r85UR=}vUv_DFxx*L~XP=}R$W!1-n3D!BA3Z5xHemv4u=UcLI5 zFB)pu7)&J+JjwM~L=WPR(%ck4R%Nxea2VKWXGPA|@a&Igli#({?oP(5YPUm+y5Khf6I1iGiwM^qyREX2#QYulyl}nz0_a-r5*gob<6ZW2h880 zX1drnp-ppP9F1VTCYoS%>0p01ESO>J%8W9STeKt+g-Mu6^(uNYa(Q$-5+%2&VEDo? zwBT&Hu$2Dvs4y$S#I#WHxfq23I;cqLBHXmFSGgpVK@q6ve`t0DU$G{ARcUfqgi+wfI)J-9WJ`K2UxX)Sft%fD ze0mfNTx>nQY-KNL>gmvUr+IuoPK;OlDfxDnD6ljKS}<06#f%7O;LkQsAL zhps+L=GByGXJ^m4C0X>nGsPlf&-H{U-c!Go|BTl&i>w{lVD&Xvmq=put|xLnZ`JGF zyilYvI;>9AE_Tq|u1r3v;cn+5>atl`PTd*=t^Cm~r@a+RHFr%GZ_|R{F`rA(ndV#r zCQOHCI)&Op#Z@MIV#pBh>RIeA{C(;2*9+iut!NH5gHA8Yi`@EEA}y;F2~B-UJR`BR zlaBr(EFCr7*_GhPMQ8xfO{BP-fwoF0+af{$I4m;C z#-L0k%zRNz0OCK62mX&?8ySyy=q)NKyLePOC0g;ra~NhBxt3|<*LYS@$;mK$D+)*X zeWC}>5w|Cs>mjJx05%d^@GsxVSrJYlX20{XqS``n^r*06pF$`0ShEt^!rn|XmL4+x zu4T`36Op<9H0(I{!QsYcxcJQ>t;U~miCjaEjJN0)hk)?WO;it?o8_W_c{6RsN|h^SzQ99hxIfzwTh=iMK%GaIIqUOhwfKm zB~w?E7CBfsuM%Aot7#i=+>gIl8kpa!H^&_?y1eC0^!DjueF^oZiSU zM(P-c7=nFhc4~Ze_aEd(8yW_xhg2?J#}Ag?F}|Mc;Da6_&fm$V?!?>19^z?y6Mc4o zZ}TLhIr?L5kFuN2W|AS$0colZwyg_v{wtnL!p+YM6Fv`^c|pTsJ{9+D5kkf?&mVthaJ1f46 zJN=lA;G66F%|`5_Z+kipFTPjD@}1gZqD|lykB-602MInDn)Z8YzB_24Y`}f0B8tJ} z){NY;he^M^YUv@}e6_I~mHk|8yqhVgQFo_RY#oTGr@Jd)1q#yr6Efh3j#v(g}rRfOtlrWh+&iLzn{p^qsh~9%|Kn{^ghHW5$pG z@ri=0$}i;a{L{mlLl=UFWvDqW87zbbr+@lxe*~i zeeDpD&p>{X0NA;(%*32;&fkYs{;cfm8K&T%Y(-)H#)y9&G3xn84fZd$tVqeess!9y zf~vm_J{z4X2ADA_5*Zrq7TVwZeMbsJxaCnTNO}f+m+7zU9olc#x5Qud1^|ihjq}GT z*Wd4i{Bh#=y}|x|qc-~AEj|@=QRSZw|D3MqKXqZh4gQ}29%6vVANd_A@onJ$2Xp`T z>KTptdQSZKS|C88ISdD$!gM#PG@ctmYCnu<#HQEn4Fcmk0xQ)2vJC#-O82I-(%Q;! zRM4~h)k^=9x33jMLM7-&suPbw^X#Xr8*NE{dkai{{s1ERnR?|ZcziN{vcpOEt90#L zVO~BXb;I{%8{}}{byKnq7P^;kcy!&ER$th(Us!c~`AB|I#@W5>^*-oC}!O`$glNH}BoW zZp5eE2ZQdfG^YhEHx8NfZJu4zTlR^O-ZeElwlYgfD#Jk6QyKM9QR7`(>v2)(aSyX~ zXZvwSnV%l&TkFEB);4SAx+60B%TD@RK)W{?yAeI(Yf+II1B*S!ura^2=+=aew3oQ) zUzb-&wP}sD;Ze2zaU~StWZrc?XCmjX%I7=MT_(zc7-irMyvm4F(l!I(WAl1PH@5e# z=Mji$>H%H-DS(B04<)efXQCZAW>0_S_hTTYHI=R#DzS2JoDg>`tKUN(@-6S5h z4At9es#ITaK`|viGh??hVHz&kBK|y))~b3y_hJfsw~qcYZa%a&8ks+$?ObB3*;=jM z#$xWa|U^xd^(=5x#TmB#!))qZZ4x#u)-{o?7jHQcU6BF45lunm1iBTiW)i7?`g zwf)UA1PkR0I+y|pi(Se18~ds=;s-_6pAi;_kHj{6A}114&9hTg)NfX7k3Y?eLQDI* zi6gc%^5=AuOv<)&i|lp(Uoq$Z&-9|l@pN?LOUe<7Zp^nt(NW7`Vpvug6FMp1&pqW^ z;aFN|$d|Gt-zwiZzSJmf98CFOlrKYUhIZK(-|}U`e94Aw?bbby$GP{W`?&Z1a3A-d zct75+=kxV`C*TE6hPX?Fe;TbsiBFiU*c3zuMlRl+YTy2V{t0 zmtkOTD=$7@->9I0$_`CU@q<>UuUsoCdCTG;<=SH8xjK>kB^>CWv?3618hKR_iNo45HvrDB@PZe8F?S2oL%RR>Bg zsLow&dJtpnH|cl1^lPc0LMf+xcRtOe{!1~D$ns)4y}^6riE*1j{(rC+oD;5k>3sBx&RFb5_m4zc@=equ zNTT~(qbUCJ#K>Bs*orrpvCV{*cXYbfg=_17QIp9u8YD8V=L4C*X28jJDs_n zb}s@IF-sA}J;__A;g3BjPIyl&5TY+^t;(9{2+Rw@xdVA(s_y&-XPgL7i3u+hHIr1JO)roWq-ox{1!M49pEYub&Uy52kMCr0y0e#N{DBS5KtX!{Pio*lE+Yf;Bk$<*r*)HU zZ~xw!!JYz_wC*poKm}`g=)S3PQl`HZrCa(;nuvba(j=S=bF#&8o*oE zRi-_*(NA}R8@mY<=3F?r9?-6&{_m25J1{pA=ySepel!*9UidIQzU36|GFosK@KueQ zH`woWxSn@aIAm096qR`iWya<4v+2momJR9Q3$E>*ls}Iy;7C#H>yV`b;s;@?j1O)d zcmG5>7`|-tHi0ls5***y$X3PKg;^27px&#}7Gd9eUahj2@VCkj_Y|&G=;)UYOq|Ys zhC(5roTI=Lj54JnUu%()%ks!E&of&CTRTC05i_TP1_JDO7vZm9=V}iiHe;3CZwn8s%4gEJ1)Z21 zwOvc?E)L$vrfB;z8*~ILxC&lH=`Ya673`s>-L4tjkGBCQrs+mWzY=3BO7`C`BBtUy_>~)p+)A`bm@TB2hS9e=te1uBu-}g z(sK$u^#PPIf9fUe0R3tHTCPfF4l7vMQiIIcM)Wl(a5n(LYKOX?zgt+%@kI}t7pyjf z1nyk95*bm)>06zGQd&YrE+ad>CB(GsqSzwoMOiaXaXT+!)WO@r2Q6=y?@}DtVB!xC zT-T;GSu(3$bI&GECp(Cx?Ab_Ka3P+LVJk2E=!359r$J-;!X&M!wpzdB57Sx3+N1 z@%kbxCA@Sdu6mz*2oivP^v4ltP5Z}b&ObWr9d&mA2p_Q`G diff --git a/readium/navigators/web/scripts/OEBPS/ur.png b/readium/navigators/web/scripts/OEBPS/ur.png deleted file mode 100644 index 061b47c5ba0c45d3184eb22a0b1432d216a4af94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56327 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 From 22490458c4c62e1f334a409e6492fb007a35386c Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Tue, 17 Sep 2024 13:53:09 +0200 Subject: [PATCH 27/61] Rebuild scripts --- .../navigators/web/scripts/dist/prepaginated-double-script.js | 2 +- .../web/scripts/dist/prepaginated-double-script.js.map | 2 +- .../navigators/web/scripts/dist/prepaginated-single-script.js | 2 +- .../web/scripts/dist/prepaginated-single-script.js.map | 2 +- .../assets/readium/navigators/web/prepaginated-double-script.js | 2 +- .../readium/navigators/web/prepaginated-double-script.js.map | 2 +- .../assets/readium/navigators/web/prepaginated-single-script.js | 2 +- .../readium/navigators/web/prepaginated-single-script.js.map | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/readium/navigators/web/scripts/dist/prepaginated-double-script.js b/readium/navigators/web/scripts/dist/prepaginated-double-script.js index 9f51a30209..7a46abfeb1 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-double-script.js +++ b/readium/navigators/web/scripts/dist/prepaginated-double-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),a=parseFloat(e.get("height"));return h&&a?{width:h,height:a}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const e={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(e),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:h},n=function(t,i,e){switch(t){case"contain":return function(t,i){console.log(`contentWidth ${t.width} containerWidth ${i.width}`);const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,a,this.viewport);this.metaViewport.content=(new i).setInitialScale(n).setMinimumScale(n).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),a=new e(i,s,h);t.loadSpread=function(t){a.loadSpread(t)},t.setViewport=function(t,i,e,s,h,n){const r={width:t,height:i},o={top:e,left:s,bottom:h,right:n};a.setViewport(r,o)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);a.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),a=parseFloat(e.get("height"));return h&&a?{width:h,height:a}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const e={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(e),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:h},r=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,a,this.viewport);this.metaViewport.content=(new i).setInitialScale(r).setMinimumScale(r).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),a=new e(i,s,h);t.loadSpread=function(t){a.loadSpread(t)},t.setViewport=function(t,i,e,s,h,r){const n={width:t,height:i},o={top:e,left:s,bottom:h,right:r};a.setViewport(n,o)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);a.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); //# sourceMappingURL=prepaginated-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map index 1a978aef4e..6638c72687 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map +++ b/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n console.log(`contentWidth ${content.width} containerWidth ${container.width}`);\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","console","log","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-single-script.js b/readium/navigators/web/scripts/dist/prepaginated-single-script.js index e2000f9155..5830f23a2d 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-single-script.js +++ b/readium/navigators/web/scripts/dist/prepaginated-single-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){console.log(`contentWidth ${t.width} containerWidth ${i.width}`);const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); //# sourceMappingURL=prepaginated-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map index 849a7648f8..30ad060820 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map +++ b/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n console.log(`contentWidth ${content.width} containerWidth ${container.width}`);\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","console","log","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js index 9f51a30209..7a46abfeb1 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),a=parseFloat(e.get("height"));return h&&a?{width:h,height:a}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const e={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(e),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:h},n=function(t,i,e){switch(t){case"contain":return function(t,i){console.log(`contentWidth ${t.width} containerWidth ${i.width}`);const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,a,this.viewport);this.metaViewport.content=(new i).setInitialScale(n).setMinimumScale(n).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),a=new e(i,s,h);t.loadSpread=function(t){a.loadSpread(t)},t.setViewport=function(t,i,e,s,h,n){const r={width:t,height:i},o={top:e,left:s,bottom:h,right:n};a.setViewport(r,o)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);a.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),a=parseFloat(e.get("height"));return h&&a?{width:h,height:a}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const e={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(e),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:h},r=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,a,this.viewport);this.metaViewport.content=(new i).setInitialScale(r).setMinimumScale(r).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),a=new e(i,s,h);t.loadSpread=function(t){a.loadSpread(t)},t.setViewport=function(t,i,e,s,h,r){const n={width:t,height:i},o={top:e,left:s,bottom:h,right:r};a.setViewport(n,o)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);a.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); //# sourceMappingURL=prepaginated-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map index 1a978aef4e..6638c72687 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n console.log(`contentWidth ${content.width} containerWidth ${container.width}`);\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","console","log","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js index e2000f9155..5830f23a2d 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){console.log(`contentWidth ${t.width} containerWidth ${i.width}`);const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); //# sourceMappingURL=prepaginated-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map index 849a7648f8..30ad060820 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n console.log(`contentWidth ${content.width} containerWidth ${container.width}`);\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","console","log","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file From 2bd77df0e51249d5693d6549a3e1f18f7806e6f2 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Tue, 17 Sep 2024 14:30:44 +0200 Subject: [PATCH 28/61] Don't use unportable cp syntax --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 354f36b39a..08cf745e90 100644 --- a/Makefile +++ b/Makefile @@ -33,4 +33,4 @@ scripts: pnpm run format; \ pnpm run lint; \ pnpm run bundle; \ - cp -t ../src/main/assets/readium/navigators/web/ dist/* + cp dist/* ../src/main/assets/readium/navigators/web/ From 645c8e01e6402dcde04273d402d90267a40a9ddc Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 18 Sep 2024 09:50:14 +0200 Subject: [PATCH 29/61] Fix navigator factory --- .../web/PrepaginatedWebNavigatorFactory.kt | 57 +++++++++++++------ 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt index 71e940cc4f..40c066fb9e 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt @@ -7,6 +7,7 @@ package org.readium.navigator.web import android.app.Application +import java.io.IOException import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorDefaults import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorPreferences import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorPreferencesEditor @@ -19,9 +20,13 @@ import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.Link import org.readium.r2.shared.publication.Locator import org.readium.r2.shared.publication.Publication +import org.readium.r2.shared.publication.epub.EpubLayout import org.readium.r2.shared.publication.indexOfFirstWithHref import org.readium.r2.shared.publication.presentation.page +import org.readium.r2.shared.publication.presentation.presentation +import org.readium.r2.shared.util.ThrowableError import org.readium.r2.shared.util.Try +import org.readium.r2.shared.util.getOrElse @ExperimentalReadiumApi @OptIn(DelicateReadiumApi::class) @@ -37,7 +42,9 @@ public class PrepaginatedWebNavigatorFactory private constructor( application: Application, publication: Publication ): PrepaginatedWebNavigatorFactory? { - if (!publication.conformsTo(Publication.Profile.EPUB)) { + if (!publication.conformsTo(Publication.Profile.EPUB) || + publication.metadata.presentation.layout != EpubLayout.FIXED + ) { return null } @@ -58,16 +65,16 @@ public class PrepaginatedWebNavigatorFactory private constructor( override val cause: org.readium.r2.shared.util.Error? ) : org.readium.r2.shared.util.Error { - public class UnsupportedPublication( - cause: org.readium.r2.shared.util.Error? = null - ) : Error("Publication is not supported.", cause) + public class Initialization( + cause: org.readium.r2.shared.util.Error + ) : Error("Could not initialize the navigator.", cause) } public suspend fun createNavigator( initialLocator: Locator? = null, initialPreferences: PrepaginatedWebNavigatorPreferences? = null, readingOrder: List = publication.readingOrder - ): Try { + ): Try { val items = readingOrder.map { PrepaginatedWebNavigatorState.ReadingOrder.Item( href = it.url(), @@ -89,15 +96,8 @@ public class PrepaginatedWebNavigatorFactory private constructor( onResourceLoadFailed = { _, _ -> } ) - val prepaginatedSingleContent = PrepaginatedSingleApi.getPageContent( - assetManager = application.assets, - assetsUrl = WebViewServer.assetUrl("readium/navigators/web")!! - ) - - val prepaginatedDoubleContent = PrepaginatedDoubleApi.getPageContent( - assetManager = application.assets, - assetsUrl = WebViewServer.assetUrl("readium/navigators/web")!! - ) + val preloads = preloadData() + .getOrElse { return Try.failure(it) } val navigatorState = PrepaginatedWebNavigatorState( @@ -107,15 +107,36 @@ public class PrepaginatedWebNavigatorFactory private constructor( defaults = defaults, initialItem = initialIndex, webViewServer = webViewServer, - preloadedData = PrepaginatedWebNavigatorState.PreloadedData( - prepaginatedSingleContent = prepaginatedSingleContent, - prepaginatedDoubleContent = prepaginatedDoubleContent - ) + preloadedData = preloads ) return Try.success(navigatorState) } + private suspend fun preloadData(): Try = + try { + val assetsUrl = WebViewServer.assetUrl("readium/navigators/web")!! + + val prepaginatedSingleContent = PrepaginatedSingleApi.getPageContent( + assetManager = application.assets, + assetsUrl = assetsUrl + ) + + val prepaginatedDoubleContent = PrepaginatedDoubleApi.getPageContent( + assetManager = application.assets, + assetsUrl = assetsUrl + ) + + val preloadData = PrepaginatedWebNavigatorState.PreloadedData( + prepaginatedSingleContent = prepaginatedSingleContent, + prepaginatedDoubleContent = prepaginatedDoubleContent + ) + + Try.success(preloadData) + } catch (e: IOException) { + Try.failure(Error.Initialization(ThrowableError(e))) + } + public fun createPreferencesEditor( currentPreferences: PrepaginatedWebNavigatorPreferences ): PrepaginatedWebNavigatorPreferencesEditor = From 1ed7d2cc001db89ef7c598ca53dbabc98d97bb31 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 18 Sep 2024 12:57:14 +0200 Subject: [PATCH 30/61] Fix item key and initial item --- .../navigator/web/PrepaginatedWebNavigator.kt | 8 +--- .../web/PrepaginatedWebNavigatorState.kt | 44 ++++++++++++++++++- .../readium/navigator/web/layout/Spread.kt | 16 ++++++- .../navigator/web/pager/NavigatorPager.kt | 2 + 4 files changed, 60 insertions(+), 10 deletions(-) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt index ef499d9022..284b1f4803 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt @@ -2,7 +2,6 @@ package org.readium.navigator.web import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.runtime.rememberUpdatedState @@ -27,17 +26,14 @@ public fun PrepaginatedWebNavigator( modifier: Modifier, state: PrepaginatedWebNavigatorState ) { - val pagerState = rememberPagerState { - state.spreads.value.size - } - val reverseLayout = LocalLayoutDirection.current.toReadingProgression() != state.settings.value.readingProgression NavigatorPager( modifier = modifier, - state = pagerState, + state = state.pagerState, beyondViewportPageCount = 2, + key = { index -> state.spreadKey(state.spreads.value[index]) }, reverseLayout = reverseLayout ) { index -> diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt index f4862a25f1..6f670c03b9 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt @@ -1,5 +1,6 @@ package org.readium.navigator.web +import androidx.compose.foundation.pager.PagerState import androidx.compose.runtime.MutableState import androidx.compose.runtime.Stable import androidx.compose.runtime.State @@ -15,6 +16,8 @@ import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorSettingsRes import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.util.WebViewServer import org.readium.r2.navigator.preferences.Fit +import org.readium.r2.navigator.preferences.ReadingProgression +import org.readium.r2.shared.DelicateReadiumApi import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.Metadata import org.readium.r2.shared.publication.presentation.Presentation @@ -22,10 +25,9 @@ import org.readium.r2.shared.util.Url @ExperimentalReadiumApi @Stable -@Suppress("Unused_parameter") public class PrepaginatedWebNavigatorState internal constructor( publicationMetadata: Metadata, - readingOrder: ReadingOrder, + private val readingOrder: ReadingOrder, initialPreferences: PrepaginatedWebNavigatorPreferences, defaults: PrepaginatedWebNavigatorDefaults, initialItem: Int, @@ -33,6 +35,10 @@ public class PrepaginatedWebNavigatorState internal constructor( internal val preloadedData: PreloadedData ) { + init { + require(initialItem < readingOrder.items.size) + } + internal data class PreloadedData( val prepaginatedSingleContent: String, val prepaginatedDoubleContent: String @@ -71,4 +77,38 @@ public class PrepaginatedWebNavigatorState internal constructor( internal val fit: State = derivedStateOf { settings.value.fit } + + internal val pagerState: PagerState = + PagerState(currentPage = spreadIndexOfItem(initialItem)) { spreads.value.size } + + public val currentItem: State = + derivedStateOf { itemIndexOfSpread(spreads.value[pagerState.currentPage]) } + + private fun spreadIndexOfItem(item: Int): Int { + val href = readingOrder.items[item].href + return spreads.value.indexOfFirst { it.contains(href) } + } + + @OptIn(DelicateReadiumApi::class) + private fun itemIndexOfSpread(spread: Spread): Int = + when (spread) { + is Spread.Single -> + readingOrder.items + .indexOfFirst { spread.page == it.href } + is Spread.Double -> + readingOrder.items + .indexOfFirst { spread.leftPage == it.href } + .takeUnless { it == -1 } + ?: readingOrder.items + .indexOfFirst { spread.rightPage == it.href } + } + + internal fun spreadKey(spread: Spread): Any = + when (spread) { + is Spread.Double -> when (settings.value.readingProgression) { + ReadingProgression.LTR -> spread.leftPage ?: spread.rightPage!! + ReadingProgression.RTL -> spread.rightPage ?: spread.leftPage!! + } + is Spread.Single -> spread.page + } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Spread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Spread.kt index b0e73e068d..c9d26ff818 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Spread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Spread.kt @@ -1,15 +1,27 @@ +@file:OptIn(DelicateReadiumApi::class) + package org.readium.navigator.web.layout +import org.readium.r2.shared.DelicateReadiumApi import org.readium.r2.shared.util.Url internal sealed class Spread { + abstract fun contains(href: Url): Boolean + data class Single( val page: Url - ) : Spread() + ) : Spread() { + + override fun contains(href: Url) = + page == href + } data class Double( val leftPage: Url?, val rightPage: Url? - ) : Spread() + ) : Spread() { + override fun contains(href: Url): Boolean = + leftPage == href || rightPage == href + } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/NavigatorPager.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/NavigatorPager.kt index 7f6f259d21..d35678cf1b 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/NavigatorPager.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/NavigatorPager.kt @@ -15,6 +15,7 @@ internal fun NavigatorPager( state: PagerState, reverseLayout: Boolean, beyondViewportPageCount: Int = 2, + key: ((index: Int) -> Any)? = null, pageContent: @Composable PagerScope.(Int) -> Unit ) { @@ -30,6 +31,7 @@ internal fun NavigatorPager( beyondViewportPageCount = beyondViewportPageCount, reverseLayout = reverseLayout, flingBehavior = flingBehavior, + key = key, pageNestedScrollConnection = PagerNestedScrollConnection( state, From b52b97d84f64dd5b5ba78b0a2e969f88d5938302 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 18 Sep 2024 16:47:41 +0200 Subject: [PATCH 31/61] Refactoring --- .../navigator/web/PrepaginatedWebNavigator.kt | 13 ++-- .../web/PrepaginatedWebNavigatorFactory.kt | 6 +- .../web/PrepaginatedWebNavigatorState.kt | 64 ++++--------------- .../navigator/web/layout/LayoutResolver.kt | 44 +++++++------ .../org/readium/navigator/web/layout/Page.kt | 9 --- .../readium/navigator/web/layout/Spread.kt | 27 -------- ...oubleSpread.kt => DoubleViewportSpread.kt} | 8 +-- ...ingleSpread.kt => SingleViewportSpread.kt} | 6 +- .../web/webapi/PrepaginatedDoubleApi.kt | 8 +-- .../web/webapi/PrepaginatedSingleApi.kt | 6 +- 10 files changed, 62 insertions(+), 129 deletions(-) delete mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Page.kt delete mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Spread.kt rename readium/navigators/web/src/main/java/org/readium/navigator/web/spread/{DoubleSpread.kt => DoubleViewportSpread.kt} (91%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/spread/{SingleSpread.kt => SingleViewportSpread.kt} (94%) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt index 284b1f4803..5788ca5aba 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt @@ -9,7 +9,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Size import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.unit.LayoutDirection -import org.readium.navigator.web.layout.Spread +import org.readium.navigator.web.layout.DoubleViewportSpread +import org.readium.navigator.web.layout.SingleViewportSpread import org.readium.navigator.web.pager.NavigatorPager import org.readium.navigator.web.spread.DoubleSpread import org.readium.navigator.web.spread.DoubleSpreadState @@ -33,7 +34,7 @@ public fun PrepaginatedWebNavigator( modifier = modifier, state = state.pagerState, beyondViewportPageCount = 2, - key = { index -> state.spreadKey(state.spreads.value[index]) }, + key = { index -> state.layout.value.pageIndexForSpread(index) }, reverseLayout = reverseLayout ) { index -> @@ -45,13 +46,13 @@ public fun PrepaginatedWebNavigator( // For some reason, index can be higher than the value of state.spreads.value.size // at this point. Try to skip composition of those extra items. - if (index >= state.spreads.value.size) { + if (index >= state.layout.value.spreads.size) { Timber.e("Compose bug") return@BoxWithConstraints } - when (val spread = state.spreads.value[index]) { - is Spread.Single -> { + when (val spread = state.layout.value.spreads[index]) { + is SingleViewportSpread -> { val spreadState = remember { SingleSpreadState( htmlData = state.preloadedData.prepaginatedSingleContent, @@ -65,7 +66,7 @@ public fun PrepaginatedWebNavigator( SingleSpread(state = spreadState) } - is Spread.Double -> { + is DoubleViewportSpread -> { val spreadState = remember { DoubleSpreadState( htmlData = state.preloadedData.prepaginatedDoubleContent, diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt index 40c066fb9e..5139c6719a 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt @@ -8,6 +8,8 @@ package org.readium.navigator.web import android.app.Application import java.io.IOException +import org.readium.navigator.web.layout.ReadingOrder +import org.readium.navigator.web.layout.ReadingOrderItem import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorDefaults import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorPreferences import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorPreferencesEditor @@ -76,7 +78,7 @@ public class PrepaginatedWebNavigatorFactory private constructor( readingOrder: List = publication.readingOrder ): Try { val items = readingOrder.map { - PrepaginatedWebNavigatorState.ReadingOrder.Item( + ReadingOrderItem( href = it.url(), page = it.properties.page ) @@ -102,7 +104,7 @@ public class PrepaginatedWebNavigatorFactory private constructor( val navigatorState = PrepaginatedWebNavigatorState( publicationMetadata = publication.metadata, - readingOrder = PrepaginatedWebNavigatorState.ReadingOrder(items), + readingOrder = ReadingOrder(items), initialPreferences = initialPreferences ?: PrepaginatedWebNavigatorPreferences(), defaults = defaults, initialItem = initialIndex, diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt index 6f670c03b9..e2f7424dfa 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt @@ -6,9 +6,9 @@ import androidx.compose.runtime.Stable import androidx.compose.runtime.State import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.mutableStateOf +import org.readium.navigator.web.layout.Layout import org.readium.navigator.web.layout.LayoutResolver -import org.readium.navigator.web.layout.Page -import org.readium.navigator.web.layout.Spread +import org.readium.navigator.web.layout.ReadingOrder import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorDefaults import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorPreferences import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorSettings @@ -16,18 +16,14 @@ import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorSettingsRes import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.util.WebViewServer import org.readium.r2.navigator.preferences.Fit -import org.readium.r2.navigator.preferences.ReadingProgression -import org.readium.r2.shared.DelicateReadiumApi import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.Metadata -import org.readium.r2.shared.publication.presentation.Presentation -import org.readium.r2.shared.util.Url @ExperimentalReadiumApi @Stable public class PrepaginatedWebNavigatorState internal constructor( publicationMetadata: Metadata, - private val readingOrder: ReadingOrder, + readingOrder: ReadingOrder, initialPreferences: PrepaginatedWebNavigatorPreferences, defaults: PrepaginatedWebNavigatorDefaults, initialItem: Int, @@ -43,25 +39,12 @@ public class PrepaginatedWebNavigatorState internal constructor( val prepaginatedSingleContent: String, val prepaginatedDoubleContent: String ) - public data class ReadingOrder( - val items: List - ) { - - public data class Item( - val href: Url, - val page: Presentation.Page? - ) - } - - public data class Location( - val href: Url - ) private val settingsResolver = PrepaginatedWebNavigatorSettingsResolver(publicationMetadata, defaults) private val layoutResolver = - LayoutResolver(readingOrder.items.map { Page(it.href, it.page) }) + LayoutResolver(readingOrder) public val preferences: MutableState = mutableStateOf(initialPreferences) @@ -72,43 +55,18 @@ public class PrepaginatedWebNavigatorState internal constructor( internal val webViewClient = WebViewClient(webViewServer) - internal val spreads: State> = - derivedStateOf { layoutResolver.layout(settings.value) } + internal val layout: State = + derivedStateOf { + val spreads = layoutResolver.layout(settings.value) + Layout(settings.value.readingProgression, spreads) + } internal val fit: State = derivedStateOf { settings.value.fit } internal val pagerState: PagerState = - PagerState(currentPage = spreadIndexOfItem(initialItem)) { spreads.value.size } + PagerState(currentPage = layout.value.spreadIndexForPage(initialItem)) { layout.value.spreads.size } public val currentItem: State = - derivedStateOf { itemIndexOfSpread(spreads.value[pagerState.currentPage]) } - - private fun spreadIndexOfItem(item: Int): Int { - val href = readingOrder.items[item].href - return spreads.value.indexOfFirst { it.contains(href) } - } - - @OptIn(DelicateReadiumApi::class) - private fun itemIndexOfSpread(spread: Spread): Int = - when (spread) { - is Spread.Single -> - readingOrder.items - .indexOfFirst { spread.page == it.href } - is Spread.Double -> - readingOrder.items - .indexOfFirst { spread.leftPage == it.href } - .takeUnless { it == -1 } - ?: readingOrder.items - .indexOfFirst { spread.rightPage == it.href } - } - - internal fun spreadKey(spread: Spread): Any = - when (spread) { - is Spread.Double -> when (settings.value.readingProgression) { - ReadingProgression.LTR -> spread.leftPage ?: spread.rightPage!! - ReadingProgression.RTL -> spread.rightPage ?: spread.leftPage!! - } - is Spread.Single -> spread.page - } + derivedStateOf { layout.value.pageIndexForSpread(pagerState.currentPage) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt index 7132787d36..78d5d5f92b 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt @@ -7,7 +7,7 @@ import org.readium.r2.shared.publication.presentation.Presentation @ExperimentalReadiumApi internal class LayoutResolver( - private val readingOrder: List + private val readingOrder: ReadingOrder ) { fun layout(settings: PrepaginatedWebNavigatorSettings): List = @@ -17,72 +17,80 @@ internal class LayoutResolver( ReadingProgression.RTL -> layoutSpreadsRtl() } } else { - readingOrder.map { Spread.Single(it.url) } + readingOrder.items.mapIndexed { index, item -> + SingleViewportSpread( + Page(index, item.href) + ) + } } private fun layoutSpreadsLtr(): List = buildList { var pending: Page? = null - for (page in readingOrder) { - when (page.page) { + for ((index, item) in readingOrder.items.withIndex()) { + val page = Page(index, item.href) + + when (item.page) { Presentation.Page.LEFT -> { - pending?.let { add(Spread.Double(it.url, null)) } + pending?.let { add(LeftOnlySpread(it)) } pending = page } Presentation.Page.RIGHT -> { - add(Spread.Double(pending?.url, page.url)) + add(DoubleViewportSpread(pending, page)) pending = null } Presentation.Page.CENTER -> { - pending?.let { add(Spread.Double(it.url, null)) } + pending?.let { add(LeftOnlySpread(it)) } pending = null - add(Spread.Single(page.url)) + add(SingleViewportSpread(page)) } null -> { if (pending == null) { pending = page } else { - add(Spread.Double(pending.url, page.url)) + add(DoubleSpread(pending, page)) pending = null } } } } - pending?.let { add(Spread.Double(it.url, null)) } + pending?.let { add(LeftOnlySpread(it)) } } private fun layoutSpreadsRtl(): List = buildList { var pending: Page? = null - for (page in readingOrder) { - when (page.page) { + for ((index, item) in readingOrder.items.withIndex()) { + val page = Page(index, item.href) + + when (item.page) { Presentation.Page.LEFT -> { - add(Spread.Double(page.url, pending?.url)) + add(DoubleViewportSpread(page, pending)) pending = null } Presentation.Page.RIGHT -> { - pending?.let { add(Spread.Double(null, it.url)) } + pending?.let { add(RightOnlySpread(it)) } pending = page } Presentation.Page.CENTER -> { - pending?.let { add(Spread.Double(null, it.url)) } + pending?.let { add(RightOnlySpread(it)) } pending = null - add(Spread.Single(page.url)) + add(SingleViewportSpread(page)) } null -> { if (pending == null) { pending = page } else { - add(Spread.Double(page.url, pending.url)) + add(DoubleSpread(page, pending)) pending = null } } } } - pending?.let { add(Spread.Double(null, it.url)) } + pending?.let { add(RightOnlySpread(it)) } } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Page.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Page.kt deleted file mode 100644 index 4ab29e4f6e..0000000000 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Page.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.readium.navigator.web.layout - -import org.readium.r2.shared.publication.presentation.Presentation -import org.readium.r2.shared.util.Url - -internal data class Page( - val url: Url, - val page: Presentation.Page? -) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Spread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Spread.kt deleted file mode 100644 index c9d26ff818..0000000000 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Spread.kt +++ /dev/null @@ -1,27 +0,0 @@ -@file:OptIn(DelicateReadiumApi::class) - -package org.readium.navigator.web.layout - -import org.readium.r2.shared.DelicateReadiumApi -import org.readium.r2.shared.util.Url - -internal sealed class Spread { - - abstract fun contains(href: Url): Boolean - - data class Single( - val page: Url - ) : Spread() { - - override fun contains(href: Url) = - page == href - } - - data class Double( - val leftPage: Url?, - val rightPage: Url? - ) : Spread() { - override fun contains(href: Url): Boolean = - leftPage == href || rightPage == href - } -} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt similarity index 91% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleSpread.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt index 39b20c5551..b6565172fd 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt @@ -11,7 +11,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Size import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import org.readium.navigator.web.layout.Spread +import org.readium.navigator.web.layout.DoubleViewportSpread import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.webapi.PrepaginatedDoubleApi import org.readium.navigator.web.webview.LoadingState @@ -73,13 +73,13 @@ internal class DoubleSpreadState( val htmlData: String, val publicationBaseUrl: AbsoluteUrl, val webViewClient: WebViewClient, - val spread: Spread.Double, + val spread: DoubleViewportSpread, val fit: State, val viewport: State ) { val left: AbsoluteUrl? = - spread.leftPage?.let { publicationBaseUrl.resolve(it) } + spread.leftPage?.let { publicationBaseUrl.resolve(it.href) } val right: AbsoluteUrl? = - spread.rightPage?.let { publicationBaseUrl.resolve(it) } + spread.rightPage?.let { publicationBaseUrl.resolve(it.href) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt similarity index 94% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleSpread.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt index 8b2a4dfab0..8b7493b1c0 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt @@ -11,7 +11,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Size import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import org.readium.navigator.web.layout.Spread +import org.readium.navigator.web.layout.SingleViewportSpread import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.webapi.PrepaginatedSingleApi import org.readium.navigator.web.webview.LoadingState @@ -73,10 +73,10 @@ internal class SingleSpreadState( val htmlData: String, val publicationBaseUrl: AbsoluteUrl, val webViewClient: WebViewClient, - val spread: Spread.Single, + val spread: SingleViewportSpread, val fit: State, val viewport: State ) { val url: AbsoluteUrl = - publicationBaseUrl.resolve(spread.page) + publicationBaseUrl.resolve(spread.page.href) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt index 6844c2c4c1..814a9f651b 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt @@ -4,7 +4,7 @@ import android.content.res.AssetManager import android.webkit.WebView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import org.readium.navigator.web.layout.Spread +import org.readium.navigator.web.layout.DoubleViewportSpread import org.readium.navigator.web.util.WebViewServer import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi @@ -26,9 +26,9 @@ internal class PrepaginatedDoubleApi( } } - fun loadSpread(spread: Spread.Double) { - val leftUrl = spread.leftPage?.let { WebViewServer.publicationBaseHref.resolve(it) } - val rightUrl = spread.rightPage?.let { WebViewServer.publicationBaseHref.resolve(it) } + fun loadSpread(spread: DoubleViewportSpread) { + val leftUrl = spread.leftPage?.let { WebViewServer.publicationBaseHref.resolve(it.href) } + val rightUrl = spread.rightPage?.let { WebViewServer.publicationBaseHref.resolve(it.href) } val argument = buildList { leftUrl?.let { add("left: `$it`") } rightUrl?.let { add("right: `$it`") } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt index 77b293ae4e..6333065808 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt @@ -4,7 +4,7 @@ import android.content.res.AssetManager import android.webkit.WebView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import org.readium.navigator.web.layout.Spread +import org.readium.navigator.web.layout.SingleViewportSpread import org.readium.navigator.web.util.WebViewServer import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi @@ -26,8 +26,8 @@ internal class PrepaginatedSingleApi( } } - fun loadSpread(spread: Spread.Single) { - val resourceUrl = WebViewServer.publicationBaseHref.resolve(spread.page) + fun loadSpread(spread: SingleViewportSpread) { + val resourceUrl = WebViewServer.publicationBaseHref.resolve(spread.page.href) val script = "layout.loadResource(`$resourceUrl`);" webView.evaluateJavascript(script) {} } From f93e377fa06a66de1682114dfef632cb5082ac8e Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 18 Sep 2024 17:08:04 +0200 Subject: [PATCH 32/61] Cosmetic changes --- .../readium/navigator/web/layout/Layout.kt | 94 +++++++++++++++++++ .../navigator/web/layout/LayoutResolver.kt | 2 +- .../navigator/web/layout/ReadingOrder.kt | 13 +++ .../navigator/web/pager/NavigatorPager.kt | 2 + .../web/spread/DoubleViewportSpread.kt | 4 +- .../web/spread/SingleViewportSpread.kt | 4 +- 6 files changed, 114 insertions(+), 5 deletions(-) create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Layout.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Layout.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Layout.kt new file mode 100644 index 0000000000..e572d2a374 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Layout.kt @@ -0,0 +1,94 @@ +@file:OptIn(ExperimentalReadiumApi::class) + +package org.readium.navigator.web.layout + +import org.readium.r2.navigator.preferences.ReadingProgression +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.util.Url + +internal class Layout( + val readingProgression: ReadingProgression, + val spreads: List +) { + + fun spreadIndexForPage(pageIndex: Int): Int = spreads + .indexOfFirst { pageIndex in it.pages.map { page -> page.index } } + .also { check(it != -1) } + + fun pageIndexForSpread(spreadIndex: Int) = + when (val spread = spreads[spreadIndex]) { + is SingleViewportSpread -> + spread.page.index + is LeftOnlySpread -> + spread.page.index + is RightOnlySpread -> + spread.page.index + is DoubleSpread -> + when (readingProgression) { + ReadingProgression.LTR -> spread.leftPage.index + ReadingProgression.RTL -> spread.rightPage.index + } + } +} + +internal data class Page( + val index: Int, + val href: Url +) + +internal sealed interface Spread { + + val pages: List + + fun contains(href: Url): Boolean = + href in pages.map { it.href } +} + +internal data class SingleViewportSpread( + val page: Page +) : Spread { + + override val pages: List get() = listOfNotNull(page) +} + +internal sealed class DoubleViewportSpread( + override val pages: List +) : Spread { + abstract val leftPage: Page? + + abstract val rightPage: Page? + + companion object { + + operator fun invoke(leftPage: Page?, rightPage: Page?): Spread = + when { + leftPage != null && rightPage != null -> DoubleSpread(leftPage, rightPage) + leftPage != null -> LeftOnlySpread(leftPage) + rightPage != null -> RightOnlySpread(rightPage) + else -> throw IllegalArgumentException("Attempt to create an empty spread.") + } + } +} + +internal data class LeftOnlySpread( + val page: Page +) : DoubleViewportSpread(listOf(page)) { + + override val leftPage: Page = page + + override val rightPage: Page? = null +} + +internal data class RightOnlySpread( + val page: Page +) : DoubleViewportSpread(listOf(page)) { + + override val leftPage: Page? = null + + override val rightPage: Page = page +} + +internal data class DoubleSpread( + override val leftPage: Page, + override val rightPage: Page +) : DoubleViewportSpread(listOf(leftPage, rightPage)) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt index 78d5d5f92b..d0bb5c9f3a 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt @@ -5,7 +5,7 @@ import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.presentation.Presentation -@ExperimentalReadiumApi +@OptIn(ExperimentalReadiumApi::class) internal class LayoutResolver( private val readingOrder: ReadingOrder ) { diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt new file mode 100644 index 0000000000..cd2818fe2a --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt @@ -0,0 +1,13 @@ +package org.readium.navigator.web.layout + +import org.readium.r2.shared.publication.presentation.Presentation +import org.readium.r2.shared.util.Url + +internal data class ReadingOrder( + val items: List +) + +internal data class ReadingOrderItem( + val href: Url, + val page: Presentation.Page? +) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/NavigatorPager.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/NavigatorPager.kt index d35678cf1b..97fb06ddb2 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/NavigatorPager.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/pager/NavigatorPager.kt @@ -26,6 +26,8 @@ internal fun NavigatorPager( HorizontalPager( modifier = modifier, + // Pages must intercept all scroll gestures so the pager moves + // only through the PagerNestedScrollConnection. userScrollEnabled = false, state = state, beyondViewportPageCount = beyondViewportPageCount, diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt index b6565172fd..a78478c659 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt @@ -1,3 +1,5 @@ +@file:OptIn(ExperimentalReadiumApi::class) + package org.readium.navigator.web.spread import androidx.compose.foundation.layout.BoxWithConstraints @@ -20,7 +22,6 @@ import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl -@OptIn(ExperimentalReadiumApi::class) @Composable internal fun DoubleSpread( state: DoubleSpreadState @@ -68,7 +69,6 @@ internal fun DoubleSpread( } } -@OptIn(ExperimentalReadiumApi::class) internal class DoubleSpreadState( val htmlData: String, val publicationBaseUrl: AbsoluteUrl, diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt index 8b7493b1c0..84fb35cc18 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt @@ -1,3 +1,5 @@ +@file:OptIn(ExperimentalReadiumApi::class) + package org.readium.navigator.web.spread import androidx.compose.foundation.layout.BoxWithConstraints @@ -20,7 +22,6 @@ import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl -@OptIn(ExperimentalReadiumApi::class) @Composable internal fun SingleSpread( state: SingleSpreadState @@ -68,7 +69,6 @@ internal fun SingleSpread( } } -@OptIn(ExperimentalReadiumApi::class) internal class SingleSpreadState( val htmlData: String, val publicationBaseUrl: AbsoluteUrl, From ef2b01b0b7e40449cdc223f8f35ec75866a965d1 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Sat, 21 Sep 2024 12:56:29 +0200 Subject: [PATCH 33/61] Reverse BoxWithConstraints and HorizontalPager order --- .../navigator/web/PrepaginatedWebNavigator.kt | 36 ++++++++----------- .../web/spread/DoubleViewportSpread.kt | 4 +-- .../web/spread/SingleViewportSpread.kt | 4 +-- 3 files changed, 18 insertions(+), 26 deletions(-) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt index 5788ca5aba..5498136d59 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt @@ -19,7 +19,6 @@ import org.readium.navigator.web.spread.SingleSpreadState import org.readium.navigator.web.util.WebViewServer import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi -import timber.log.Timber @ExperimentalReadiumApi @Composable @@ -27,29 +26,22 @@ public fun PrepaginatedWebNavigator( modifier: Modifier, state: PrepaginatedWebNavigatorState ) { - val reverseLayout = - LocalLayoutDirection.current.toReadingProgression() != state.settings.value.readingProgression + BoxWithConstraints( + modifier = Modifier.fillMaxSize(), + propagateMinConstraints = true + ) { + val viewportState = rememberUpdatedState(Size(maxWidth.value, maxHeight.value)) - NavigatorPager( - modifier = modifier, - state = state.pagerState, - beyondViewportPageCount = 2, - key = { index -> state.layout.value.pageIndexForSpread(index) }, - reverseLayout = reverseLayout - ) { index -> + val reverseLayout = + LocalLayoutDirection.current.toReadingProgression() != state.settings.value.readingProgression - BoxWithConstraints( - modifier = Modifier.fillMaxSize(), - propagateMinConstraints = true - ) { - val viewportState = rememberUpdatedState(Size(maxWidth.value, maxHeight.value)) - - // For some reason, index can be higher than the value of state.spreads.value.size - // at this point. Try to skip composition of those extra items. - if (index >= state.layout.value.spreads.size) { - Timber.e("Compose bug") - return@BoxWithConstraints - } + NavigatorPager( + modifier = modifier, + state = state.pagerState, + beyondViewportPageCount = 2, + key = { index -> state.layout.value.pageIndexForSpread(index) }, + reverseLayout = reverseLayout + ) { index -> when (val spread = state.layout.value.spreads[index]) { is SingleViewportSpread -> { diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt index a78478c659..8b4e5ffab8 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt @@ -2,7 +2,7 @@ package org.readium.navigator.web.spread -import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -26,7 +26,7 @@ import org.readium.r2.shared.util.AbsoluteUrl internal fun DoubleSpread( state: DoubleSpreadState ) { - BoxWithConstraints( + Box( modifier = Modifier.fillMaxSize(), propagateMinConstraints = true ) { diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt index 84fb35cc18..17dad16878 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt @@ -2,7 +2,7 @@ package org.readium.navigator.web.spread -import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -26,7 +26,7 @@ import org.readium.r2.shared.util.AbsoluteUrl internal fun SingleSpread( state: SingleSpreadState ) { - BoxWithConstraints( + Box( modifier = Modifier.fillMaxSize(), propagateMinConstraints = true ) { From 48092d48f1c085c07aea3e4645b802941a46a2b7 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Sat, 21 Sep 2024 17:45:36 +0200 Subject: [PATCH 34/61] Renaming --- .../org/readium/navigator/web/PrepaginatedWebNavigator.kt | 8 ++++---- .../readium/navigator/web/spread/DoubleViewportSpread.kt | 2 +- .../readium/navigator/web/spread/SingleViewportSpread.kt | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt index 5498136d59..8d807a8fd2 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt @@ -12,10 +12,10 @@ import androidx.compose.ui.unit.LayoutDirection import org.readium.navigator.web.layout.DoubleViewportSpread import org.readium.navigator.web.layout.SingleViewportSpread import org.readium.navigator.web.pager.NavigatorPager -import org.readium.navigator.web.spread.DoubleSpread import org.readium.navigator.web.spread.DoubleSpreadState -import org.readium.navigator.web.spread.SingleSpread +import org.readium.navigator.web.spread.DoubleViewportSpread import org.readium.navigator.web.spread.SingleSpreadState +import org.readium.navigator.web.spread.SingleViewportSpread import org.readium.navigator.web.util.WebViewServer import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi @@ -56,7 +56,7 @@ public fun PrepaginatedWebNavigator( ) } - SingleSpread(state = spreadState) + SingleViewportSpread(state = spreadState) } is DoubleViewportSpread -> { val spreadState = remember { @@ -70,7 +70,7 @@ public fun PrepaginatedWebNavigator( ) } - DoubleSpread(state = spreadState) + DoubleViewportSpread(state = spreadState) } } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt index 8b4e5ffab8..42b079dd0c 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt @@ -23,7 +23,7 @@ import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl @Composable -internal fun DoubleSpread( +internal fun DoubleViewportSpread( state: DoubleSpreadState ) { Box( diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt index 17dad16878..01af2c5e44 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt @@ -23,7 +23,7 @@ import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl @Composable -internal fun SingleSpread( +internal fun SingleViewportSpread( state: SingleSpreadState ) { Box( From 0427968454c8b3d0b867eef332d10a5858e10d2d Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 25 Sep 2024 12:22:18 +0200 Subject: [PATCH 35/61] Add fullscreen mode, set safe drawing area, handle taps --- .../readium/navigator/demo/DemoActivity.kt | 130 +++++------------- .../org/readium/navigator/demo/DemoReader.kt | 95 +++++++++++++ .../navigator/demo/util/Fullscreenable.kt | 27 ++++ .../dist/prepaginated-double-script.js | 2 +- .../dist/prepaginated-double-script.js.map | 2 +- .../dist/prepaginated-injectable-script.js | 2 + .../prepaginated-injectable-script.js.map | 1 + .../dist/prepaginated-single-script.js | 2 +- .../dist/prepaginated-single-script.js.map | 2 +- .../web/scripts/src/common/gestures.ts | 79 +++++++++++ .../scripts/src/index-prepaginated-double.ts | 4 +- .../src/index-prepaginated-injectable.ts | 38 +++++ .../scripts/src/index-prepaginated-single.ts | 4 +- .../src/prepaginated/double-area-manager.ts | 6 +- .../src/prepaginated/single-area-manager.ts | 13 +- .../navigators/web/scripts/webpack.config.js | 1 + .../web/prepaginated-double-script.js | 2 +- .../web/prepaginated-double-script.js.map | 2 +- .../web/prepaginated-injectable-script.js | 2 + .../web/prepaginated-injectable-script.js.map | 1 + .../web/prepaginated-single-script.js | 2 +- .../web/prepaginated-single-script.js.map | 2 +- .../navigator/web/PrepaginatedWebNavigator.kt | 35 ++++- .../web/spread/DoubleViewportSpread.kt | 18 +-- .../web/spread/SingleViewportSpread.kt | 20 +-- .../navigator/web/spread/SpreadWebView.kt | 23 +++- .../readium/navigator/web/util/DisplayArea.kt | 15 ++ .../navigator/web/util/HtmlInjector.kt | 10 +- .../navigator/web/webapi/GesturesApi.kt | 42 ++++++ .../web/webapi/PrepaginatedDoubleApi.kt | 11 +- .../web/webapi/PrepaginatedSingleApi.kt | 10 +- 31 files changed, 462 insertions(+), 141 deletions(-) create mode 100644 readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoReader.kt create mode 100644 readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Fullscreenable.kt create mode 100644 readium/navigators/web/scripts/dist/prepaginated-injectable-script.js create mode 100644 readium/navigators/web/scripts/dist/prepaginated-injectable-script.js.map create mode 100644 readium/navigators/web/scripts/src/common/gestures.ts create mode 100644 readium/navigators/web/scripts/src/index-prepaginated-injectable.ts create mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js create mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js.map create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/util/DisplayArea.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/GesturesApi.kt diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt index d1fd6a43d0..3d559e6326 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt @@ -10,38 +10,19 @@ import android.net.Uri import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.safeDrawingPadding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Settings -import androidx.compose.material3.CenterAlignedTopAppBar -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet -import androidx.compose.material3.Scaffold -import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState -import androidx.compose.material3.rememberModalBottomSheetState -import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier -import org.readium.navigator.demo.preferences.UserPreferences -import org.readium.navigator.web.PrepaginatedWebNavigator -import org.readium.r2.shared.ExperimentalReadiumApi +import androidx.core.view.WindowCompat +import org.readium.navigator.demo.util.Fullscreenable import org.readium.r2.shared.util.toAbsoluteUrl -@OptIn(ExperimentalReadiumApi::class, ExperimentalMaterial3Api::class) class DemoActivity : ComponentActivity() { private val viewModel: DemoViewModel by viewModels() @@ -56,90 +37,55 @@ class DemoActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + enableEdgeToEdge() setContent { MaterialTheme { - val snackbarHostState = remember { SnackbarHostState() } - val preferencesSheetState = rememberModalBottomSheetState() - var showPreferences by remember { mutableStateOf(false) } + val fullscreenState = remember { mutableStateOf(false) } - Scaffold( - modifier = Modifier - .safeDrawingPadding() - .fillMaxSize(), - topBar = { - TopBar( - onPreferencesActivated = { - showPreferences = !showPreferences - } - ) - }, - snackbarHost = { SnackbarHost(hostState = snackbarHostState) } - ) { paddingValues -> + Fullscreenable( + fullscreenState = fullscreenState, + insetsController = WindowCompat.getInsetsController(window, window.decorView) + ) { + val snackbarHostState = remember { SnackbarHostState() } + val state = viewModel.state.collectAsState() - Box( - modifier = Modifier - .padding(paddingValues) - .fillMaxSize(), - propagateMinConstraints = true - ) { - val state = viewModel.state.collectAsState() + LaunchedEffect(state.value) { + fullscreenState.value = when (state.value) { + DemoViewModel.State.BookSelection -> true + is DemoViewModel.State.Error -> false + DemoViewModel.State.Loading -> true + is DemoViewModel.State.Reader -> true + } + } - when (val stateNow = state.value) { - DemoViewModel.State.BookSelection -> { + when (val stateNow = state.value) { + DemoViewModel.State.BookSelection -> { + LaunchedEffect(stateNow) { sharedStoragePickerLauncher.launch(arrayOf("*/*")) } - is DemoViewModel.State.Error -> { - LaunchedEffect(stateNow.error) { - snackbarHostState.showSnackbar(stateNow.error.message) - viewModel.acknowledgeError() - } - } - DemoViewModel.State.Loading -> { - // Display nothing - } - is DemoViewModel.State.Reader -> { - if (showPreferences) { - ModalBottomSheet( - sheetState = preferencesSheetState, - onDismissRequest = { showPreferences = false } - ) { - UserPreferences( - model = stateNow.preferencesViewModel, - title = "Preferences" - ) - } - } + } - PrepaginatedWebNavigator( - modifier = Modifier - .fillMaxSize(), - state = stateNow.navigatorState - ) + is DemoViewModel.State.Error -> { + LaunchedEffect(stateNow.error) { + snackbarHostState.showSnackbar(stateNow.error.message) + viewModel.acknowledgeError() } } + + DemoViewModel.State.Loading -> { + // Display and do nothing + } + + is DemoViewModel.State.Reader -> { + Reader( + state = stateNow, + fullScreenState = fullscreenState + ) + } } } } } } - - @Composable - private fun TopBar( - onPreferencesActivated: () -> Unit - ) { - CenterAlignedTopAppBar( - title = {}, - actions = { - IconButton( - onClick = onPreferencesActivated - ) { - Icon( - imageVector = Icons.Filled.Settings, - contentDescription = "Preferences" - ) - } - } - ) - } } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoReader.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoReader.kt new file mode 100644 index 0000000000..8ae50f8a26 --- /dev/null +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoReader.kt @@ -0,0 +1,95 @@ +/* + * Copyright 2024 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +package org.readium.navigator.demo + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Settings +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.rememberModalBottomSheetState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.zIndex +import org.readium.navigator.demo.preferences.UserPreferences +import org.readium.navigator.web.PrepaginatedWebNavigator +import org.readium.r2.shared.ExperimentalReadiumApi + +@OptIn(ExperimentalMaterial3Api::class, ExperimentalReadiumApi::class) +@Composable +fun Reader( + state: DemoViewModel.State.Reader, + fullScreenState: MutableState +) { + val showPreferences = remember { mutableStateOf(false) } + val preferencesSheetState = rememberModalBottomSheetState() + + if (showPreferences.value) { + ModalBottomSheet( + sheetState = preferencesSheetState, + onDismissRequest = { showPreferences.value = false } + ) { + UserPreferences( + model = state.preferencesViewModel, + title = "Preferences" + ) + } + } + + Box { + TopBar( + modifier = Modifier.zIndex(1f), + visible = !fullScreenState.value, + onPreferencesActivated = { showPreferences.value = !showPreferences.value } + ) + + PrepaginatedWebNavigator( + modifier = Modifier.fillMaxSize(), + state = state.navigatorState, + onTap = { fullScreenState.value = !fullScreenState.value; true } + ) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TopBar( + modifier: Modifier, + visible: Boolean, + onPreferencesActivated: () -> Unit +) { + AnimatedVisibility( + modifier = modifier, + visible = visible, + enter = fadeIn(), + exit = fadeOut() + ) { + TopAppBar( + title = {}, + actions = { + IconButton( + onClick = onPreferencesActivated + ) { + Icon( + imageVector = Icons.Filled.Settings, + contentDescription = "Preferences" + ) + } + } + ) + } +} diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Fullscreenable.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Fullscreenable.kt new file mode 100644 index 0000000000..9c62858f22 --- /dev/null +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Fullscreenable.kt @@ -0,0 +1,27 @@ +package org.readium.navigator.demo.util + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.State +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.WindowInsetsControllerCompat + +@Composable +fun Fullscreenable( + fullscreenState: State, + insetsController: WindowInsetsControllerCompat, + content: @Composable () -> Unit +) { + insetsController.systemBarsBehavior = + WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + + LaunchedEffect(fullscreenState.value) { + if (fullscreenState.value) { + insetsController.hide(WindowInsetsCompat.Type.systemBars()) + } else { + insetsController.show(WindowInsetsCompat.Type.systemBars()) + } + } + + content.invoke() +} diff --git a/readium/navigators/web/scripts/dist/prepaginated-double-script.js b/readium/navigators/web/scripts/dist/prepaginated-double-script.js index 7a46abfeb1..d51c7d9b5c 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-double-script.js +++ b/readium/navigators/web/scripts/dist/prepaginated-double-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),a=parseFloat(e.get("height"));return h&&a?{width:h,height:a}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const e={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(e),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:h},r=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,a,this.viewport);this.metaViewport.content=(new i).setInitialScale(r).setMinimumScale(r).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),a=new e(i,s,h);t.loadSpread=function(t){a.loadSpread(t)},t.setViewport=function(t,i,e,s,h,r){const n={width:t,height:i},o={top:e,left:s,bottom:h,right:r};a.setViewport(n,o)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);a.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),a=parseFloat(e.get("height"));return h&&a?{width:h,height:a}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const e={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(e),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:h},r={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},n=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,a,r);this.metaViewport.content=(new i).setInitialScale(n).setMinimumScale(n).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),a=new e(i,s,h);t.loadSpread=function(t){a.loadSpread(t)},t.setViewport=function(t,i,e,s,h,r){const n={width:t,height:i},o={top:e,left:r,bottom:h,right:s};a.setViewport(n,o)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);a.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); //# sourceMappingURL=prepaginated-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map index 6638c72687..c93825de7e 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map +++ b/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js b/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js new file mode 100644 index 0000000000..9cbd72d6d4 --- /dev/null +++ b/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js @@ -0,0 +1,2 @@ +!function(){"use strict";new class{constructor(e,t){this.window=e,this.listener=t,e.addEventListener("DOMContentLoaded",(()=>{document.addEventListener("click",(e=>{this.onClick(e)}),!1)}))}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();t&&t.isCollapsed||e.target instanceof Element&&this.nearestInteractiveElement(e.target)||(this.listener.onTap(e),e.stopPropagation(),e.preventDefault())}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e.outerHTML:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}(window,new class{constructor(e){this.listener=e}onTap(e){const t={x:e.clientX,y:e.clientY};this.listener.onTap(JSON.stringify(t))}}(window.gestures))}(); +//# sourceMappingURL=prepaginated-injectable-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js.map new file mode 100644 index 0000000000..3f72da9906 --- /dev/null +++ b/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js.map @@ -0,0 +1 @@ +{"version":3,"file":"prepaginated-injectable-script.js","mappings":"yBAUA,ICVO,MACH,WAAAA,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBD,EAAOG,iBAAiB,oBAAoB,KACxCC,SAASD,iBAAiB,SAAUE,IAAYH,KAAKI,QAAQD,EAAM,IAAK,EAAM,GAEtF,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC1BD,GAAaA,EAAUE,aAIvBL,EAAMM,kBAAkBC,SAAWV,KAAKW,0BAA0BR,EAAMM,UAG5ET,KAAKD,SAASa,MAAMT,GACpBA,EAAMU,kBACNV,EAAMW,iBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAAQM,UAQfN,EAAQO,cACDtB,KAAKW,0BAA0BI,EAAQO,eAE3C,IACX,GD9CgBxB,OAAQ,IAT5B,MACI,WAAAD,CAAYE,GACRC,KAAKD,SAAWA,CACpB,CACA,KAAAa,CAAMT,GACF,MAAMoB,EAAW,CAAEC,EAAGrB,EAAMsB,QAASC,EAAGvB,EAAMwB,SAC9C3B,KAAKD,SAASa,MAAMgB,KAAKC,UAAUN,GACvC,GAEoDzB,OAAOgC,U","sources":["webpack://readium-js/./src/index-prepaginated-injectable.ts","webpack://readium-js/./src/common/gestures.ts"],"sourcesContent":["import { GesturesManager } from \"./common/gestures\";\nclass AdapterGesturesListener {\n constructor(listener) {\n this.listener = listener;\n }\n onTap(event) {\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.listener.onTap(JSON.stringify(tapEvent));\n }\n}\nnew GesturesManager(window, new AdapterGesturesListener(window.gestures));\n","export class GesturesManager {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n window.addEventListener(\"DOMContentLoaded\", () => {\n document.addEventListener(\"click\", (event) => { this.onClick(event); }, false);\n });\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.isCollapsed) {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n return;\n }\n if (event.target instanceof Element && this.nearestInteractiveElement(event.target)) {\n return;\n }\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n"],"names":["constructor","window","listener","this","addEventListener","document","event","onClick","defaultPrevented","selection","getSelection","isCollapsed","target","Element","nearestInteractiveElement","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","tapEvent","x","clientX","y","clientY","JSON","stringify","gestures"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-single-script.js b/readium/navigators/web/scripts/dist/prepaginated-single-script.js index 5830f23a2d..3f81f03ce9 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-single-script.js +++ b/readium/navigators/web/scripts/dist/prepaginated-single-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,e);this.metaViewport.content=(new i).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:a,bottom:n,right:s};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); //# sourceMappingURL=prepaginated-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map index 30ad060820..6f23c43b82 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map +++ b/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/src/common/gestures.ts b/readium/navigators/web/scripts/src/common/gestures.ts new file mode 100644 index 0000000000..33cab1bab0 --- /dev/null +++ b/readium/navigators/web/scripts/src/common/gestures.ts @@ -0,0 +1,79 @@ +export interface GesturesListener { + + onTap(event: MouseEvent): void +} + +export class GesturesManager { + + private readonly listener: GesturesListener + + private readonly window: Window + + constructor(window: Window, listener: GesturesListener) { + this.window = window + this.listener = listener + window.addEventListener("DOMContentLoaded", () => { + document.addEventListener("click", (event) => { this.onClick(event) }, false) + }) + } + + private onClick(event: MouseEvent) { + if (event.defaultPrevented) { + return + } + + const selection = this.window.getSelection() + if (selection && selection.isCollapsed) { + // There's an on-going selection, the tap will dismiss it so we don't forward it. + return; + } + + if (event.target instanceof Element && this.nearestInteractiveElement(event.target)) { + return + } + + this.listener.onTap(event); + + event.stopPropagation(); + event.preventDefault(); + } + + // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling + private nearestInteractiveElement(element: Element): string | null { + if (element == null) { + return null; + } + const interactiveTags = [ + "a", + "audio", + "button", + "canvas", + "details", + "input", + "label", + "option", + "select", + "submit", + "textarea", + "video", + ]; + if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) { + return element.outerHTML; + } + + // Checks whether the element is editable by the user. + if ( + element.hasAttribute("contenteditable") && + element.getAttribute("contenteditable")!.toLowerCase() != "false" + ) { + return element.outerHTML; + } + + // Checks parents recursively because the touch might be for example on an inside a . + if (element.parentElement) { + return this.nearestInteractiveElement(element.parentElement); + } + + return null; + } +} diff --git a/readium/navigators/web/scripts/src/index-prepaginated-double.ts b/readium/navigators/web/scripts/src/index-prepaginated-double.ts index 1b84559e67..c9d267a63e 100644 --- a/readium/navigators/web/scripts/src/index-prepaginated-double.ts +++ b/readium/navigators/web/scripts/src/index-prepaginated-double.ts @@ -28,9 +28,9 @@ namespace Layout { viewporttWidth: number, viewportHeight: number, insetTop: number, - insetLeft: number, + insetRight: number, insetBottom: number, - insetRight: number + insetLeft: number, ) { const viewport: Size = { width: viewporttWidth, height: viewportHeight} const insets: Insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight } diff --git a/readium/navigators/web/scripts/src/index-prepaginated-injectable.ts b/readium/navigators/web/scripts/src/index-prepaginated-injectable.ts new file mode 100644 index 0000000000..ca85931cd8 --- /dev/null +++ b/readium/navigators/web/scripts/src/index-prepaginated-injectable.ts @@ -0,0 +1,38 @@ +import { GesturesManager, GesturesListener } from "./common/gestures"; + +interface Listener { + + onTap(event: string): void + +} + +interface TapEvent { + + x: number + + y: number +} + +declare global { + + interface Window { + + gestures: Listener + } +} + +class AdapterGesturesListener implements GesturesListener { + + readonly listener: Listener + + constructor(listener: Listener) { + this.listener = listener + } + + onTap(event: MouseEvent): void { + const tapEvent: TapEvent = { x: event.clientX, y: event.clientY } + this.listener.onTap(JSON.stringify(tapEvent)) + } +} + +new GesturesManager(window, new AdapterGesturesListener(window.gestures)) diff --git a/readium/navigators/web/scripts/src/index-prepaginated-single.ts b/readium/navigators/web/scripts/src/index-prepaginated-single.ts index 1b77749aab..f94452ce8e 100644 --- a/readium/navigators/web/scripts/src/index-prepaginated-single.ts +++ b/readium/navigators/web/scripts/src/index-prepaginated-single.ts @@ -42,9 +42,9 @@ namespace Layout { viewporttWidth: number, viewportHeight: number, insetTop: number, - insetLeft: number, + insetRight: number, insetBottom: number, - insetRight: number + insetLeft: number, ) { const viewport: Size = { width: viewporttWidth, height: viewportHeight}; diff --git a/readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts b/readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts index ce41419eca..2dc514cd4f 100644 --- a/readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts +++ b/readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts @@ -88,7 +88,11 @@ export class DoubleAreaManager { const contentWidth = this.leftPage.size!.width + this.rightPage.size!.width const contentHeight = Math.max(this.leftPage.size!.height, this.rightPage.size!.height) const contentSize = { width: contentWidth, height: contentHeight } - const scale = computeScale(this.fit, contentSize, this.viewport) + const safeDrawingSize = { + width: this.viewport.width - this.insets.left - this.insets.right, + height: this.viewport.height - this.insets.top - this.insets.bottom + } + const scale = computeScale(this.fit, contentSize, safeDrawingSize) this.metaViewport.content = new ViewportStringBuilder() .setInitialScale(scale) diff --git a/readium/navigators/web/scripts/src/prepaginated/single-area-manager.ts b/readium/navigators/web/scripts/src/prepaginated/single-area-manager.ts index e31969af9c..4826fcfdd5 100644 --- a/readium/navigators/web/scripts/src/prepaginated/single-area-manager.ts +++ b/readium/navigators/web/scripts/src/prepaginated/single-area-manager.ts @@ -58,10 +58,19 @@ export class SingleAreaManager { return } - const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left } + const margins = { + top: this.insets.top, + right: this.insets.right, + bottom: this.insets.bottom, + left: this.insets.left + } this.page.setMargins(margins) - const scale = computeScale(this.fit, this.page.size, this.viewport) + const safeDrawingSize = { + width: this.viewport.width - this.insets.left - this.insets.right, + height: this.viewport.height - this.insets.top - this.insets.bottom + } + const scale = computeScale(this.fit, this.page.size, safeDrawingSize) this.metaViewport.content = new ViewportStringBuilder() .setInitialScale(scale) .setMinimumScale(scale) diff --git a/readium/navigators/web/scripts/webpack.config.js b/readium/navigators/web/scripts/webpack.config.js index eabac50034..89bcde9150 100644 --- a/readium/navigators/web/scripts/webpack.config.js +++ b/readium/navigators/web/scripts/webpack.config.js @@ -7,6 +7,7 @@ module.exports = { entry: { "prepaginated-single-script": "./src/index-prepaginated-single.ts", "prepaginated-double-script": "./src/index-prepaginated-double.ts", + "prepaginated-injectable-script": "./src/index-prepaginated-injectable.ts", }, resolve: { // Add '.ts' and '.tsx' as resolvable extensions. diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js index 7a46abfeb1..d51c7d9b5c 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),a=parseFloat(e.get("height"));return h&&a?{width:h,height:a}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const e={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(e),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:h},r=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,a,this.viewport);this.metaViewport.content=(new i).setInitialScale(r).setMinimumScale(r).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),a=new e(i,s,h);t.loadSpread=function(t){a.loadSpread(t)},t.setViewport=function(t,i,e,s,h,r){const n={width:t,height:i},o={top:e,left:s,bottom:h,right:r};a.setViewport(n,o)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);a.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),a=parseFloat(e.get("height"));return h&&a?{width:h,height:a}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const e={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(e),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:h},r={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},n=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,a,r);this.metaViewport.content=(new i).setInitialScale(n).setMinimumScale(n).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),a=new e(i,s,h);t.loadSpread=function(t){a.loadSpread(t)},t.setViewport=function(t,i,e,s,h,r){const n={width:t,height:i},o={top:e,left:r,bottom:h,right:s};a.setViewport(n,o)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);a.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); //# sourceMappingURL=prepaginated-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map index 6638c72687..c93825de7e 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const scale = computeScale(this.fit, contentSize, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js new file mode 100644 index 0000000000..9cbd72d6d4 --- /dev/null +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js @@ -0,0 +1,2 @@ +!function(){"use strict";new class{constructor(e,t){this.window=e,this.listener=t,e.addEventListener("DOMContentLoaded",(()=>{document.addEventListener("click",(e=>{this.onClick(e)}),!1)}))}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();t&&t.isCollapsed||e.target instanceof Element&&this.nearestInteractiveElement(e.target)||(this.listener.onTap(e),e.stopPropagation(),e.preventDefault())}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e.outerHTML:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}(window,new class{constructor(e){this.listener=e}onTap(e){const t={x:e.clientX,y:e.clientY};this.listener.onTap(JSON.stringify(t))}}(window.gestures))}(); +//# sourceMappingURL=prepaginated-injectable-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js.map new file mode 100644 index 0000000000..3f72da9906 --- /dev/null +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js.map @@ -0,0 +1 @@ +{"version":3,"file":"prepaginated-injectable-script.js","mappings":"yBAUA,ICVO,MACH,WAAAA,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBD,EAAOG,iBAAiB,oBAAoB,KACxCC,SAASD,iBAAiB,SAAUE,IAAYH,KAAKI,QAAQD,EAAM,IAAK,EAAM,GAEtF,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC1BD,GAAaA,EAAUE,aAIvBL,EAAMM,kBAAkBC,SAAWV,KAAKW,0BAA0BR,EAAMM,UAG5ET,KAAKD,SAASa,MAAMT,GACpBA,EAAMU,kBACNV,EAAMW,iBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAAQM,UAQfN,EAAQO,cACDtB,KAAKW,0BAA0BI,EAAQO,eAE3C,IACX,GD9CgBxB,OAAQ,IAT5B,MACI,WAAAD,CAAYE,GACRC,KAAKD,SAAWA,CACpB,CACA,KAAAa,CAAMT,GACF,MAAMoB,EAAW,CAAEC,EAAGrB,EAAMsB,QAASC,EAAGvB,EAAMwB,SAC9C3B,KAAKD,SAASa,MAAMgB,KAAKC,UAAUN,GACvC,GAEoDzB,OAAOgC,U","sources":["webpack://readium-js/./src/index-prepaginated-injectable.ts","webpack://readium-js/./src/common/gestures.ts"],"sourcesContent":["import { GesturesManager } from \"./common/gestures\";\nclass AdapterGesturesListener {\n constructor(listener) {\n this.listener = listener;\n }\n onTap(event) {\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.listener.onTap(JSON.stringify(tapEvent));\n }\n}\nnew GesturesManager(window, new AdapterGesturesListener(window.gestures));\n","export class GesturesManager {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n window.addEventListener(\"DOMContentLoaded\", () => {\n document.addEventListener(\"click\", (event) => { this.onClick(event); }, false);\n });\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.isCollapsed) {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n return;\n }\n if (event.target instanceof Element && this.nearestInteractiveElement(event.target)) {\n return;\n }\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n"],"names":["constructor","window","listener","this","addEventListener","document","event","onClick","defaultPrevented","selection","getSelection","isCollapsed","target","Element","nearestInteractiveElement","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","tapEvent","x","clientX","y","clientY","JSON","stringify","gestures"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js index 5830f23a2d..3f81f03ce9 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,this.viewport);this.metaViewport.content=(new i).setInitialScale(e).setMinimumScale(e).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:s,bottom:n,right:a};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); +!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,e);this.metaViewport.content=(new i).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:a,bottom:n,right:s};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); //# sourceMappingURL=prepaginated-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map index 30ad060820..6f23c43b82 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: this.insets.left };\n this.page.setMargins(margins);\n const scale = computeScale(this.fit, this.page.size, this.viewport);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetLeft, insetBottom, insetRight) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetLeft","insetBottom","insetRight","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt index 8d807a8fd2..fe6113e07a 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt @@ -1,12 +1,15 @@ package org.readium.navigator.web import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.displayCutout import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Size +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.unit.LayoutDirection import org.readium.navigator.web.layout.DoubleViewportSpread @@ -16,21 +19,35 @@ import org.readium.navigator.web.spread.DoubleSpreadState import org.readium.navigator.web.spread.DoubleViewportSpread import org.readium.navigator.web.spread.SingleSpreadState import org.readium.navigator.web.spread.SingleViewportSpread +import org.readium.navigator.web.util.AbsolutePaddingValues +import org.readium.navigator.web.util.DisplayArea import org.readium.navigator.web.util.WebViewServer +import org.readium.r2.navigator.input.TapEvent import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi @ExperimentalReadiumApi @Composable public fun PrepaginatedWebNavigator( - modifier: Modifier, + modifier: Modifier = Modifier, + displayCutout: WindowInsets = WindowInsets.displayCutout, + onTap: (TapEvent) -> Unit = {}, state: PrepaginatedWebNavigatorState ) { BoxWithConstraints( modifier = Modifier.fillMaxSize(), propagateMinConstraints = true ) { - val viewportState = rememberUpdatedState(Size(maxWidth.value, maxHeight.value)) + val viewportSize = Size(maxWidth.value, maxHeight.value) + + val safeDrawingPadding = AbsolutePaddingValues( + top = displayCutout.getTop(LocalDensity.current), + right = displayCutout.getRight(LocalDensity.current, LocalLayoutDirection.current), + bottom = displayCutout.getBottom(LocalDensity.current), + left = displayCutout.getLeft(LocalDensity.current, LocalLayoutDirection.current) + ) + + val displayArea = rememberUpdatedState(DisplayArea(viewportSize, safeDrawingPadding)) val reverseLayout = LocalLayoutDirection.current.toReadingProgression() != state.settings.value.readingProgression @@ -52,11 +69,14 @@ public fun PrepaginatedWebNavigator( webViewClient = state.webViewClient, spread = spread, fit = state.fit, - viewport = viewportState + displayArea = displayArea ) } - SingleViewportSpread(state = spreadState) + SingleViewportSpread( + onTap = onTap, + state = spreadState + ) } is DoubleViewportSpread -> { val spreadState = remember { @@ -66,11 +86,14 @@ public fun PrepaginatedWebNavigator( webViewClient = state.webViewClient, spread = spread, fit = state.fit, - viewport = viewportState + displayArea = displayArea ) } - DoubleViewportSpread(state = spreadState) + DoubleViewportSpread( + onTap = onTap, + state = spreadState + ) } } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt index 42b079dd0c..0b0224c952 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt @@ -10,20 +10,22 @@ import androidx.compose.runtime.State import androidx.compose.runtime.remember import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier -import androidx.compose.ui.geometry.Size import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.readium.navigator.web.layout.DoubleViewportSpread +import org.readium.navigator.web.util.DisplayArea import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.webapi.PrepaginatedDoubleApi import org.readium.navigator.web.webview.LoadingState import org.readium.navigator.web.webview.rememberWebViewStateWithHTMLData +import org.readium.r2.navigator.input.TapEvent import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl @Composable internal fun DoubleViewportSpread( + onTap: (TapEvent) -> Unit, state: DoubleSpreadState ) { Box( @@ -35,7 +37,7 @@ internal fun DoubleViewportSpread( baseUrl = state.publicationBaseUrl.toString() ) - val webApi = remember(webViewState.webView, webViewState.loadingState) { + val layoutApi = remember(webViewState.webView, webViewState.loadingState) { webViewState.webView ?.takeIf { webViewState.loadingState is LoadingState.Finished } ?.let { @@ -43,7 +45,7 @@ internal fun DoubleViewportSpread( } } - webApi?.let { api -> + layoutApi?.let { api -> LaunchedEffect(api) { snapshotFlow { state.fit.value @@ -52,10 +54,9 @@ internal fun DoubleViewportSpread( }.launchIn(this) snapshotFlow { - state.viewport.value + state.displayArea.value }.onEach { - val (width, height) = state.viewport.value - api.setViewport(width, height) + api.setDisplayArea(it) }.launchIn(this) api.loadSpread(state.spread) @@ -64,7 +65,8 @@ internal fun DoubleViewportSpread( SpreadWebView( state = webViewState, - client = state.webViewClient + client = state.webViewClient, + onTap = onTap ) } } @@ -75,7 +77,7 @@ internal class DoubleSpreadState( val webViewClient: WebViewClient, val spread: DoubleViewportSpread, val fit: State, - val viewport: State + val displayArea: State ) { val left: AbsoluteUrl? = spread.leftPage?.let { publicationBaseUrl.resolve(it.href) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt index 01af2c5e44..ff2e63f532 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt @@ -10,20 +10,22 @@ import androidx.compose.runtime.State import androidx.compose.runtime.remember import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier -import androidx.compose.ui.geometry.Size import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.readium.navigator.web.layout.SingleViewportSpread +import org.readium.navigator.web.util.DisplayArea import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.webapi.PrepaginatedSingleApi import org.readium.navigator.web.webview.LoadingState import org.readium.navigator.web.webview.rememberWebViewStateWithHTMLData +import org.readium.r2.navigator.input.TapEvent import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl @Composable internal fun SingleViewportSpread( + onTap: (TapEvent) -> Unit, state: SingleSpreadState ) { Box( @@ -35,7 +37,7 @@ internal fun SingleViewportSpread( baseUrl = state.publicationBaseUrl.toString() ) - val webApi = remember(webViewState.webView, webViewState.loadingState) { + val layoutApi = remember(webViewState.webView, webViewState.loadingState) { webViewState.webView ?.takeIf { webViewState.loadingState is LoadingState.Finished } ?.let { @@ -43,19 +45,18 @@ internal fun SingleViewportSpread( } } - webApi?.let { api -> + layoutApi?.let { api -> LaunchedEffect(api) { snapshotFlow { state.fit.value }.onEach { - api.setFit(state.fit.value) + api.setFit(it) }.launchIn(this) snapshotFlow { - state.viewport.value + state.displayArea.value }.onEach { - val (width, height) = state.viewport.value - api.setViewport(width, height) + api.setDisplayArea(it) }.launchIn(this) api.loadSpread(state.spread) @@ -64,7 +65,8 @@ internal fun SingleViewportSpread( SpreadWebView( state = webViewState, - client = state.webViewClient + client = state.webViewClient, + onTap = onTap ) } } @@ -75,7 +77,7 @@ internal class SingleSpreadState( val webViewClient: WebViewClient, val spread: SingleViewportSpread, val fit: State, - val viewport: State + val displayArea: State ) { val url: AbsoluteUrl = publicationBaseUrl.resolve(spread.page.href) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt index 1149e8618c..b95269f438 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt @@ -1,25 +1,46 @@ package org.readium.navigator.web.spread import android.annotation.SuppressLint +import android.graphics.PointF import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalDensity import org.readium.navigator.web.util.WebViewClient +import org.readium.navigator.web.webapi.GesturesApi +import org.readium.navigator.web.webapi.GesturesListener import org.readium.navigator.web.webview.WebView import org.readium.navigator.web.webview.WebViewScrollable2DState import org.readium.navigator.web.webview.WebViewState +import org.readium.r2.navigator.input.TapEvent @SuppressLint("SetJavaScriptEnabled") @Composable internal fun SpreadWebView( state: WebViewState, - client: WebViewClient + client: WebViewClient, + onTap: (TapEvent) -> Unit ) { val scrollableState = remember { WebViewScrollable2DState() } val spreadNestedScrollConnection = SpreadNestedScrollConnection(scrollableState) + val density = LocalDensity.current + + val gesturesApi = remember(onTap) { + val listener = object : GesturesListener { + override fun onTap(point: PointF) { + onTap(TapEvent(point)) + } + } + GesturesApi(density, listener) + } + + LaunchedEffect(state.webView) { + state.webView?.let { gesturesApi.registerOnWebView(it) } + } WebView( modifier = Modifier diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/DisplayArea.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/DisplayArea.kt new file mode 100644 index 0000000000..f8bc43872b --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/DisplayArea.kt @@ -0,0 +1,15 @@ +package org.readium.navigator.web.util + +import androidx.compose.ui.geometry.Size + +internal data class DisplayArea( + val viewportSize: Size, + val safeDrawingPadding: AbsolutePaddingValues +) + +internal data class AbsolutePaddingValues( + val top: Int, + val right: Int, + val bottom: Int, + val left: Int +) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/HtmlInjector.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/HtmlInjector.kt index 5592c662c1..94a1951c4f 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/HtmlInjector.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/HtmlInjector.kt @@ -6,7 +6,7 @@ package org.readium.navigator.web.util -import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.navigator.web.webapi.GesturesApi import org.readium.r2.shared.publication.Publication import org.readium.r2.shared.publication.services.isProtected import org.readium.r2.shared.util.AbsoluteUrl @@ -22,8 +22,6 @@ import timber.log.Timber * * @param baseHref Base URL where and scripts are served. */ -@OptIn(ExperimentalReadiumApi::class) -@Suppress("UNUSED_PARAMETER") internal fun Resource.injectHtml( publication: Publication, mediaType: MediaType, @@ -38,9 +36,9 @@ internal fun Resource.injectHtml( var content = bytes.toString(mediaType.charset ?: Charsets.UTF_8).trim() val injectables = mutableListOf() - /*injectables.add( - script(baseHref.resolve(Url("readium/scripts/readium-fixed.js")!!)) - )*/ + injectables.add( + script(baseHref.resolve(GesturesApi.path)) + ) // Disable the text selection if the publication is protected. // FIXME: This is a hack until proper LCP copy is implemented, see https://github.com/readium/kotlin-toolkit/issues/221 diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/GesturesApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/GesturesApi.kt new file mode 100644 index 0000000000..4a6db9b719 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/GesturesApi.kt @@ -0,0 +1,42 @@ +package org.readium.navigator.web.webapi + +import android.graphics.PointF +import android.webkit.WebView +import androidx.compose.ui.unit.Density +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import org.readium.r2.shared.util.RelativeUrl + +internal interface GesturesListener { + + fun onTap(point: PointF) +} + +internal class GesturesApi( + private val density: Density, + private val listener: GesturesListener +) { + + companion object { + + val path: RelativeUrl = + RelativeUrl("readium/navigators/web/prepaginated-injectable-script.js")!! + } + + fun registerOnWebView(webView: WebView) { + webView.addJavascriptInterface(this, "gestures") + } + + @android.webkit.JavascriptInterface + fun onTap(eventJson: String) { + val tapEvent = Json.decodeFromString(eventJson) + val point = with(density) { PointF(tapEvent.x.toDp().value, tapEvent.y.toDp().value) } + listener.onTap(point) + } +} + +@Serializable +private data class JsonTapEvent( + val x: Float, + val y: Float +) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt index 814a9f651b..755585f98f 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt @@ -5,6 +5,7 @@ import android.webkit.WebView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import org.readium.navigator.web.layout.DoubleViewportSpread +import org.readium.navigator.web.util.DisplayArea import org.readium.navigator.web.util.WebViewServer import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi @@ -36,8 +37,14 @@ internal class PrepaginatedDoubleApi( webView.evaluateJavascript("layout.loadSpread($argument);") {} } - fun setViewport(width: Float, height: Float) { - webView.evaluateJavascript("layout.setViewport($width, $height, 0, 0, 0, 0);") {} + fun setDisplayArea(displayArea: DisplayArea) { + val (width, height) = displayArea.viewportSize + val top = displayArea.safeDrawingPadding.top + val right = displayArea.safeDrawingPadding.right + val bottom = displayArea.safeDrawingPadding.bottom + val left = displayArea.safeDrawingPadding.left + val script = "layout.setViewport($width, $height, $top, $right, $bottom, $left);" + webView.evaluateJavascript(script) {} } fun setFit(fit: Fit) { diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt index 6333065808..4299d14a69 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt @@ -5,6 +5,7 @@ import android.webkit.WebView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import org.readium.navigator.web.layout.SingleViewportSpread +import org.readium.navigator.web.util.DisplayArea import org.readium.navigator.web.util.WebViewServer import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi @@ -32,8 +33,13 @@ internal class PrepaginatedSingleApi( webView.evaluateJavascript(script) {} } - fun setViewport(width: Float, height: Float) { - val script = "layout.setViewport($width, $height, 0, 0, 0, 0);" + fun setDisplayArea(displayArea: DisplayArea) { + val (width, height) = displayArea.viewportSize + val top = displayArea.safeDrawingPadding.top + val right = displayArea.safeDrawingPadding.right + val bottom = displayArea.safeDrawingPadding.bottom + val left = displayArea.safeDrawingPadding.left + val script = "layout.setViewport($width, $height, $top, $right, $bottom, $left);" webView.evaluateJavascript(script) {} } From 14b4d5238a7886f2d584a38c3ce0e33e5a868357 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 25 Sep 2024 12:40:53 +0200 Subject: [PATCH 36/61] Fix null defaults and cosmetic changes --- .../org/readium/navigator/demo/DemoReader.kt | 4 +-- .../readium/navigator/demo/DemoViewModel.kt | 14 ++++---- .../demo/preferences/UserPreferences.kt | 4 +-- ...edWebNavigator.kt => FixedWebNavigator.kt} | 4 +-- ...Factory.kt => FixedWebNavigatorFactory.kt} | 34 +++++++++---------- ...atorState.kt => FixedWebNavigatorState.kt} | 20 +++++------ .../navigator/web/layout/LayoutResolver.kt | 4 +-- ...vigatorDefaults.kt => FixedWebDefaults.kt} | 6 ++-- ...rPreferences.kt => FixedWebPreferences.kt} | 8 ++--- ...Editor.kt => FixedWebPreferencesEditor.kt} | 28 +++++++-------- .../preferences/FixedWebPreferencesFilters.kt | 34 +++++++++++++++++++ ...vigatorSettings.kt => FixedWebSettings.kt} | 2 +- ...esolver.kt => FixedWebSettingsResolver.kt} | 8 ++--- ...paginatedWebNavigatorPreferencesFilters.kt | 34 ------------------- 14 files changed, 102 insertions(+), 102 deletions(-) rename readium/navigators/web/src/main/java/org/readium/navigator/web/{PrepaginatedWebNavigator.kt => FixedWebNavigator.kt} (98%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/{PrepaginatedWebNavigatorFactory.kt => FixedWebNavigatorFactory.kt} (79%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/{PrepaginatedWebNavigatorState.kt => FixedWebNavigatorState.kt} (73%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/{PrepaginatedWebNavigatorDefaults.kt => FixedWebDefaults.kt} (71%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/{PrepaginatedWebNavigatorPreferences.kt => FixedWebPreferences.kt} (72%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/{PrepaginatedWebNavigatorPreferencesEditor.kt => FixedWebPreferencesEditor.kt} (73%) create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebPreferencesFilters.kt rename readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/{PrepaginatedWebNavigatorSettings.kt => FixedWebSettings.kt} (88%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/{PrepaginatedWebNavigatorSettingsResolver.kt => FixedWebSettingsResolver.kt} (80%) delete mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferencesFilters.kt diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoReader.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoReader.kt index 8ae50f8a26..5ae2c8e5ea 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoReader.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoReader.kt @@ -26,7 +26,7 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.zIndex import org.readium.navigator.demo.preferences.UserPreferences -import org.readium.navigator.web.PrepaginatedWebNavigator +import org.readium.navigator.web.FixedWebNavigator import org.readium.r2.shared.ExperimentalReadiumApi @OptIn(ExperimentalMaterial3Api::class, ExperimentalReadiumApi::class) @@ -57,7 +57,7 @@ fun Reader( onPreferencesActivated = { showPreferences.value = !showPreferences.value } ) - PrepaginatedWebNavigator( + FixedWebNavigator( modifier = Modifier.fillMaxSize(), state = state.navigatorState, onTap = { fullScreenState.value = !fullScreenState.value; true } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt index 9c070fd5b5..c40fd35553 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt @@ -19,9 +19,9 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import org.readium.navigator.demo.preferences.PreferencesManager import org.readium.navigator.demo.preferences.UserPreferencesViewModel -import org.readium.navigator.web.PrepaginatedWebNavigatorFactory -import org.readium.navigator.web.PrepaginatedWebNavigatorState -import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorPreferences +import org.readium.navigator.web.FixedWebNavigatorFactory +import org.readium.navigator.web.FixedWebNavigatorState +import org.readium.navigator.web.preferences.FixedWebPreferences import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl import org.readium.r2.shared.util.DebugError @@ -49,8 +49,8 @@ class DemoViewModel( ) : State data class Reader( - val navigatorState: PrepaginatedWebNavigatorState, - val preferencesViewModel: UserPreferencesViewModel + val navigatorState: FixedWebNavigatorState, + val preferencesViewModel: UserPreferencesViewModel ) : State } @@ -92,7 +92,7 @@ class DemoViewModel( return@launch } - val navigatorFactory = PrepaginatedWebNavigatorFactory(getApplication(), publication) + val navigatorFactory = FixedWebNavigatorFactory(getApplication(), publication) ?: run { publication.close() val error = DebugError("Publication not supported") @@ -100,7 +100,7 @@ class DemoViewModel( return@launch } - val initialPreferences = PrepaginatedWebNavigatorPreferences() + val initialPreferences = FixedWebPreferences() val preferencesViewModel = UserPreferencesViewModel( diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferences.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferences.kt index cfbc1e8942..5111ed0fbd 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferences.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferences.kt @@ -26,7 +26,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorPreferencesEditor +import org.readium.navigator.web.preferences.FixedWebPreferencesEditor import org.readium.r2.navigator.preferences.Configurable import org.readium.r2.navigator.preferences.EnumPreference import org.readium.r2.navigator.preferences.Fit @@ -90,7 +90,7 @@ private fun

      , E : PreferencesEditor

      > UserPref Divider() when (editor) { - is PrepaginatedWebNavigatorPreferencesEditor -> + is FixedWebPreferencesEditor -> FixedLayoutUserPreferences( commit = commit, readingProgression = editor.readingProgression, diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt similarity index 98% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt index fe6113e07a..fba0d6edab 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigator.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt @@ -28,11 +28,11 @@ import org.readium.r2.shared.ExperimentalReadiumApi @ExperimentalReadiumApi @Composable -public fun PrepaginatedWebNavigator( +public fun FixedWebNavigator( modifier: Modifier = Modifier, displayCutout: WindowInsets = WindowInsets.displayCutout, onTap: (TapEvent) -> Unit = {}, - state: PrepaginatedWebNavigatorState + state: FixedWebNavigatorState ) { BoxWithConstraints( modifier = Modifier.fillMaxSize(), diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt similarity index 79% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt index 5139c6719a..683da04030 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorFactory.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt @@ -10,9 +10,9 @@ import android.app.Application import java.io.IOException import org.readium.navigator.web.layout.ReadingOrder import org.readium.navigator.web.layout.ReadingOrderItem -import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorDefaults -import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorPreferences -import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorPreferencesEditor +import org.readium.navigator.web.preferences.FixedWebDefaults +import org.readium.navigator.web.preferences.FixedWebPreferences +import org.readium.navigator.web.preferences.FixedWebPreferencesEditor import org.readium.navigator.web.util.WebViewServer import org.readium.navigator.web.webapi.PrepaginatedDoubleApi import org.readium.navigator.web.webapi.PrepaginatedSingleApi @@ -32,10 +32,10 @@ import org.readium.r2.shared.util.getOrElse @ExperimentalReadiumApi @OptIn(DelicateReadiumApi::class) -public class PrepaginatedWebNavigatorFactory private constructor( +public class FixedWebNavigatorFactory private constructor( private val application: Application, private val publication: Publication, - private val defaults: PrepaginatedWebNavigatorDefaults + private val defaults: FixedWebDefaults ) { public companion object { @@ -43,7 +43,7 @@ public class PrepaginatedWebNavigatorFactory private constructor( public operator fun invoke( application: Application, publication: Publication - ): PrepaginatedWebNavigatorFactory? { + ): FixedWebNavigatorFactory? { if (!publication.conformsTo(Publication.Profile.EPUB) || publication.metadata.presentation.layout != EpubLayout.FIXED ) { @@ -54,10 +54,10 @@ public class PrepaginatedWebNavigatorFactory private constructor( return null } - return PrepaginatedWebNavigatorFactory( + return FixedWebNavigatorFactory( application, publication, - PrepaginatedWebNavigatorDefaults() + FixedWebDefaults() ) } } @@ -74,9 +74,9 @@ public class PrepaginatedWebNavigatorFactory private constructor( public suspend fun createNavigator( initialLocator: Locator? = null, - initialPreferences: PrepaginatedWebNavigatorPreferences? = null, + initialPreferences: FixedWebPreferences? = null, readingOrder: List = publication.readingOrder - ): Try { + ): Try { val items = readingOrder.map { ReadingOrderItem( href = it.url(), @@ -102,10 +102,10 @@ public class PrepaginatedWebNavigatorFactory private constructor( .getOrElse { return Try.failure(it) } val navigatorState = - PrepaginatedWebNavigatorState( + FixedWebNavigatorState( publicationMetadata = publication.metadata, readingOrder = ReadingOrder(items), - initialPreferences = initialPreferences ?: PrepaginatedWebNavigatorPreferences(), + initialPreferences = initialPreferences ?: FixedWebPreferences(), defaults = defaults, initialItem = initialIndex, webViewServer = webViewServer, @@ -115,7 +115,7 @@ public class PrepaginatedWebNavigatorFactory private constructor( return Try.success(navigatorState) } - private suspend fun preloadData(): Try = + private suspend fun preloadData(): Try = try { val assetsUrl = WebViewServer.assetUrl("readium/navigators/web")!! @@ -129,7 +129,7 @@ public class PrepaginatedWebNavigatorFactory private constructor( assetsUrl = assetsUrl ) - val preloadData = PrepaginatedWebNavigatorState.PreloadedData( + val preloadData = FixedWebNavigatorState.PreloadedData( prepaginatedSingleContent = prepaginatedSingleContent, prepaginatedDoubleContent = prepaginatedDoubleContent ) @@ -140,9 +140,9 @@ public class PrepaginatedWebNavigatorFactory private constructor( } public fun createPreferencesEditor( - currentPreferences: PrepaginatedWebNavigatorPreferences - ): PrepaginatedWebNavigatorPreferencesEditor = - PrepaginatedWebNavigatorPreferencesEditor( + currentPreferences: FixedWebPreferences + ): FixedWebPreferencesEditor = + FixedWebPreferencesEditor( currentPreferences, publication.metadata, defaults diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt similarity index 73% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt index e2f7424dfa..d9f5f9e56f 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/PrepaginatedWebNavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt @@ -9,10 +9,10 @@ import androidx.compose.runtime.mutableStateOf import org.readium.navigator.web.layout.Layout import org.readium.navigator.web.layout.LayoutResolver import org.readium.navigator.web.layout.ReadingOrder -import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorDefaults -import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorPreferences -import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorSettings -import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorSettingsResolver +import org.readium.navigator.web.preferences.FixedWebDefaults +import org.readium.navigator.web.preferences.FixedWebPreferences +import org.readium.navigator.web.preferences.FixedWebSettings +import org.readium.navigator.web.preferences.FixedWebSettingsResolver import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.util.WebViewServer import org.readium.r2.navigator.preferences.Fit @@ -21,11 +21,11 @@ import org.readium.r2.shared.publication.Metadata @ExperimentalReadiumApi @Stable -public class PrepaginatedWebNavigatorState internal constructor( +public class FixedWebNavigatorState internal constructor( publicationMetadata: Metadata, readingOrder: ReadingOrder, - initialPreferences: PrepaginatedWebNavigatorPreferences, - defaults: PrepaginatedWebNavigatorDefaults, + initialPreferences: FixedWebPreferences, + defaults: FixedWebDefaults, initialItem: Int, internal val webViewServer: WebViewServer, internal val preloadedData: PreloadedData @@ -41,15 +41,15 @@ public class PrepaginatedWebNavigatorState internal constructor( ) private val settingsResolver = - PrepaginatedWebNavigatorSettingsResolver(publicationMetadata, defaults) + FixedWebSettingsResolver(publicationMetadata, defaults) private val layoutResolver = LayoutResolver(readingOrder) - public val preferences: MutableState = + public val preferences: MutableState = mutableStateOf(initialPreferences) - public val settings: State = + public val settings: State = derivedStateOf { settingsResolver.settings(preferences.value) } internal val webViewClient = diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt index d0bb5c9f3a..3e10e37f9a 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt @@ -1,6 +1,6 @@ package org.readium.navigator.web.layout -import org.readium.navigator.web.preferences.PrepaginatedWebNavigatorSettings +import org.readium.navigator.web.preferences.FixedWebSettings import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.presentation.Presentation @@ -10,7 +10,7 @@ internal class LayoutResolver( private val readingOrder: ReadingOrder ) { - fun layout(settings: PrepaginatedWebNavigatorSettings): List = + fun layout(settings: FixedWebSettings): List = if (settings.spreads) { when (settings.readingProgression) { ReadingProgression.LTR -> layoutSpreadsLtr() diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorDefaults.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebDefaults.kt similarity index 71% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorDefaults.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebDefaults.kt index b84cf8c24c..da76c40ecf 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorDefaults.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebDefaults.kt @@ -5,8 +5,8 @@ import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi @ExperimentalReadiumApi -public data class PrepaginatedWebNavigatorDefaults( - val fit: Fit? = Fit.CONTAIN, +public data class FixedWebDefaults( + val fit: Fit? = null, val readingProgression: ReadingProgression? = null, - val spreads: Boolean? = false + val spreads: Boolean? = null ) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferences.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebPreferences.kt similarity index 72% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferences.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebPreferences.kt index 228ec8e1af..23ccd68189 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferences.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebPreferences.kt @@ -8,18 +8,18 @@ import org.readium.r2.shared.ExperimentalReadiumApi @Serializable @ExperimentalReadiumApi -public data class PrepaginatedWebNavigatorPreferences( +public data class FixedWebPreferences( val fit: Fit? = null, val readingProgression: ReadingProgression? = null, val spreads: Boolean? = null -) : Configurable.Preferences { +) : Configurable.Preferences { init { require(fit in listOf(null, Fit.CONTAIN, Fit.WIDTH, Fit.HEIGHT)) } - override operator fun plus(other: PrepaginatedWebNavigatorPreferences): PrepaginatedWebNavigatorPreferences = - PrepaginatedWebNavigatorPreferences( + override operator fun plus(other: FixedWebPreferences): FixedWebPreferences = + FixedWebPreferences( fit = other.fit ?: fit, readingProgression = other.readingProgression ?: readingProgression, spreads = other.spreads ?: spreads diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferencesEditor.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebPreferencesEditor.kt similarity index 73% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferencesEditor.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebPreferencesEditor.kt index 482c4c1c16..27f2fd4801 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferencesEditor.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebPreferencesEditor.kt @@ -18,36 +18,36 @@ import org.readium.r2.shared.InternalReadiumApi import org.readium.r2.shared.publication.Metadata /** - * Interactive editor of [PrepaginatedWebNavigatorPreferences]. + * Interactive editor of [FixedWebPreferences]. * * This can be used as a view model for a user preferences screen. * - * @see PrepaginatedWebNavigatorPreferences + * @see FixedWebPreferences */ @ExperimentalReadiumApi @OptIn(InternalReadiumApi::class) -public class PrepaginatedWebNavigatorPreferencesEditor internal constructor( - initialPreferences: PrepaginatedWebNavigatorPreferences, +public class FixedWebPreferencesEditor internal constructor( + initialPreferences: FixedWebPreferences, publicationMetadata: Metadata, - defaults: PrepaginatedWebNavigatorDefaults -) : PreferencesEditor { + defaults: FixedWebDefaults +) : PreferencesEditor { private data class State( - val preferences: PrepaginatedWebNavigatorPreferences, - val settings: PrepaginatedWebNavigatorSettings + val preferences: FixedWebPreferences, + val settings: FixedWebSettings ) - private val settingsResolver: PrepaginatedWebNavigatorSettingsResolver = - PrepaginatedWebNavigatorSettingsResolver(publicationMetadata, defaults) + private val settingsResolver: FixedWebSettingsResolver = + FixedWebSettingsResolver(publicationMetadata, defaults) private var state: State = initialPreferences.toState() - override val preferences: PrepaginatedWebNavigatorPreferences + override val preferences: FixedWebPreferences get() = state.preferences override fun clear() { - updateValues { PrepaginatedWebNavigatorPreferences() } + updateValues { FixedWebPreferences() } } public val fit: EnumPreference = @@ -77,12 +77,12 @@ public class PrepaginatedWebNavigatorPreferencesEditor internal constructor( ) private fun updateValues( - updater: (PrepaginatedWebNavigatorPreferences) -> PrepaginatedWebNavigatorPreferences + updater: (FixedWebPreferences) -> FixedWebPreferences ) { val newPreferences = updater(preferences) state = newPreferences.toState() } - private fun PrepaginatedWebNavigatorPreferences.toState() = + private fun FixedWebPreferences.toState() = State(preferences = this, settings = settingsResolver.settings(this)) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebPreferencesFilters.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebPreferencesFilters.kt new file mode 100644 index 0000000000..89c693659f --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebPreferencesFilters.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2022 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +package org.readium.navigator.web.preferences + +import org.readium.r2.navigator.preferences.PreferencesFilter +import org.readium.r2.shared.ExperimentalReadiumApi + +/** + * Suggested filter to keep only shared [FixedWebPreferences]. + */ +@ExperimentalReadiumApi +public object FixedWebSharedPreferencesFilter : PreferencesFilter { + + override fun filter(preferences: FixedWebPreferences): FixedWebPreferences = + preferences.copy( + readingProgression = null + ) +} + +/** + * Suggested filter to keep only publication-specific [FixedWebPreferences]. + */ +@ExperimentalReadiumApi +public object FixedWebPublicationPreferencesFilter : PreferencesFilter { + + override fun filter(preferences: FixedWebPreferences): FixedWebPreferences = + FixedWebPreferences( + readingProgression = preferences.readingProgression + ) +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorSettings.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebSettings.kt similarity index 88% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorSettings.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebSettings.kt index 1ca209a900..01f11534bc 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorSettings.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebSettings.kt @@ -6,7 +6,7 @@ import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi @ExperimentalReadiumApi -public data class PrepaginatedWebNavigatorSettings( +public data class FixedWebSettings( val fit: Fit, val readingProgression: ReadingProgression, val spreads: Boolean diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorSettingsResolver.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebSettingsResolver.kt similarity index 80% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorSettingsResolver.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebSettingsResolver.kt index 8d4708eb83..1d5c5223d7 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorSettingsResolver.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebSettingsResolver.kt @@ -7,12 +7,12 @@ import org.readium.r2.shared.publication.Metadata import org.readium.r2.shared.publication.ReadingProgression as PublicationReadingProgression @ExperimentalReadiumApi -internal class PrepaginatedWebNavigatorSettingsResolver( +internal class FixedWebSettingsResolver( private val metadata: Metadata, - private val defaults: PrepaginatedWebNavigatorDefaults + private val defaults: FixedWebDefaults ) { - fun settings(preferences: PrepaginatedWebNavigatorPreferences): PrepaginatedWebNavigatorSettings { + fun settings(preferences: FixedWebPreferences): FixedWebSettings { val readingProgression: ReadingProgression = preferences.readingProgression ?: when (metadata.readingProgression) { @@ -26,7 +26,7 @@ internal class PrepaginatedWebNavigatorSettingsResolver( val spreads = preferences.spreads ?: defaults.spreads ?: false - return PrepaginatedWebNavigatorSettings( + return FixedWebSettings( fit = fit, readingProgression = readingProgression, spreads = spreads diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferencesFilters.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferencesFilters.kt deleted file mode 100644 index 7c2af843e3..0000000000 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/PrepaginatedWebNavigatorPreferencesFilters.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2022 Readium Foundation. All rights reserved. - * Use of this source code is governed by the BSD-style license - * available in the top-level LICENSE file of the project. - */ - -package org.readium.navigator.web.preferences - -import org.readium.r2.navigator.preferences.PreferencesFilter -import org.readium.r2.shared.ExperimentalReadiumApi - -/** - * Suggested filter to keep only shared [PrepaginatedWebNavigatorPreferences]. - */ -@ExperimentalReadiumApi -public object NavigatorSharedPreferencesFilter : PreferencesFilter { - - override fun filter(preferences: PrepaginatedWebNavigatorPreferences): PrepaginatedWebNavigatorPreferences = - preferences.copy( - readingProgression = null - ) -} - -/** - * Suggested filter to keep only publication-specific [PrepaginatedWebNavigatorPreferences]. - */ -@ExperimentalReadiumApi -public object NavigatorPublicationPreferencesFilter : PreferencesFilter { - - override fun filter(preferences: PrepaginatedWebNavigatorPreferences): PrepaginatedWebNavigatorPreferences = - PrepaginatedWebNavigatorPreferences( - readingProgression = preferences.readingProgression - ) -} From f227a8422e9b3c6c908ee2168963f0e7d3eada41 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 25 Sep 2024 12:50:58 +0200 Subject: [PATCH 37/61] Use prettier for TypeScript --- .../navigators/web/scripts/.prettierrc.json | 3 + .../dist/prepaginated-double-script.js.map | 2 +- .../prepaginated-injectable-script.js.map | 2 +- .../dist/prepaginated-single-script.js.map | 2 +- readium/navigators/web/scripts/package.json | 2 +- .../web/scripts/src/common/gestures.ts | 39 ++++---- .../web/scripts/src/common/types.ts | 12 +-- .../scripts/src/index-prepaginated-double.ts | 72 +++++++-------- .../src/index-prepaginated-injectable.ts | 36 +++----- .../scripts/src/index-prepaginated-single.ts | 92 +++++++++---------- .../src/prepaginated/double-area-manager.ts | 38 +++++--- .../scripts/src/prepaginated/page-manager.ts | 45 ++++----- .../src/prepaginated/single-area-manager.ts | 25 ++--- .../navigators/web/scripts/src/util/fit.ts | 25 +++-- .../web/scripts/src/util/viewport.ts | 8 +- .../navigators/web/scripts/webpack.config.js | 6 +- .../web/prepaginated-double-script.js.map | 2 +- .../web/prepaginated-injectable-script.js.map | 2 +- .../web/prepaginated-single-script.js.map | 2 +- 19 files changed, 214 insertions(+), 201 deletions(-) diff --git a/readium/navigators/web/scripts/.prettierrc.json b/readium/navigators/web/scripts/.prettierrc.json index e69de29bb2..cce9d3c080 100644 --- a/readium/navigators/web/scripts/.prettierrc.json +++ b/readium/navigators/web/scripts/.prettierrc.json @@ -0,0 +1,3 @@ +{ + "semi": false +} diff --git a/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map index c93825de7e..4eac876379 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map +++ b/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = {\n onIframeLoaded: () => {\n this.layout();\n },\n };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js.map index 3f72da9906..c91b43cb01 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js.map +++ b/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-injectable-script.js","mappings":"yBAUA,ICVO,MACH,WAAAA,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBD,EAAOG,iBAAiB,oBAAoB,KACxCC,SAASD,iBAAiB,SAAUE,IAAYH,KAAKI,QAAQD,EAAM,IAAK,EAAM,GAEtF,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC1BD,GAAaA,EAAUE,aAIvBL,EAAMM,kBAAkBC,SAAWV,KAAKW,0BAA0BR,EAAMM,UAG5ET,KAAKD,SAASa,MAAMT,GACpBA,EAAMU,kBACNV,EAAMW,iBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAAQM,UAQfN,EAAQO,cACDtB,KAAKW,0BAA0BI,EAAQO,eAE3C,IACX,GD9CgBxB,OAAQ,IAT5B,MACI,WAAAD,CAAYE,GACRC,KAAKD,SAAWA,CACpB,CACA,KAAAa,CAAMT,GACF,MAAMoB,EAAW,CAAEC,EAAGrB,EAAMsB,QAASC,EAAGvB,EAAMwB,SAC9C3B,KAAKD,SAASa,MAAMgB,KAAKC,UAAUN,GACvC,GAEoDzB,OAAOgC,U","sources":["webpack://readium-js/./src/index-prepaginated-injectable.ts","webpack://readium-js/./src/common/gestures.ts"],"sourcesContent":["import { GesturesManager } from \"./common/gestures\";\nclass AdapterGesturesListener {\n constructor(listener) {\n this.listener = listener;\n }\n onTap(event) {\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.listener.onTap(JSON.stringify(tapEvent));\n }\n}\nnew GesturesManager(window, new AdapterGesturesListener(window.gestures));\n","export class GesturesManager {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n window.addEventListener(\"DOMContentLoaded\", () => {\n document.addEventListener(\"click\", (event) => { this.onClick(event); }, false);\n });\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.isCollapsed) {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n return;\n }\n if (event.target instanceof Element && this.nearestInteractiveElement(event.target)) {\n return;\n }\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n"],"names":["constructor","window","listener","this","addEventListener","document","event","onClick","defaultPrevented","selection","getSelection","isCollapsed","target","Element","nearestInteractiveElement","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","tapEvent","x","clientX","y","clientY","JSON","stringify","gestures"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-injectable-script.js","mappings":"yBAUA,ICVO,MACH,WAAAA,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBD,EAAOG,iBAAiB,oBAAoB,KACxCC,SAASD,iBAAiB,SAAUE,IAChCH,KAAKI,QAAQD,EAAM,IACpB,EAAM,GAEjB,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC1BD,GAAaA,EAAUE,aAIvBL,EAAMM,kBAAkBC,SACxBV,KAAKW,0BAA0BR,EAAMM,UAGzCT,KAAKD,SAASa,MAAMT,GACpBA,EAAMU,kBACNV,EAAMW,iBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAAQM,UAQfN,EAAQO,cACDtB,KAAKW,0BAA0BI,EAAQO,eAE3C,IACX,GDjDgBxB,OAAQ,IAT5B,MACI,WAAAD,CAAYE,GACRC,KAAKD,SAAWA,CACpB,CACA,KAAAa,CAAMT,GACF,MAAMoB,EAAW,CAAEC,EAAGrB,EAAMsB,QAASC,EAAGvB,EAAMwB,SAC9C3B,KAAKD,SAASa,MAAMgB,KAAKC,UAAUN,GACvC,GAEoDzB,OAAOgC,U","sources":["webpack://readium-js/./src/index-prepaginated-injectable.ts","webpack://readium-js/./src/common/gestures.ts"],"sourcesContent":["import { GesturesManager } from \"./common/gestures\";\nclass AdapterGesturesListener {\n constructor(listener) {\n this.listener = listener;\n }\n onTap(event) {\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.listener.onTap(JSON.stringify(tapEvent));\n }\n}\nnew GesturesManager(window, new AdapterGesturesListener(window.gestures));\n","export class GesturesManager {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n window.addEventListener(\"DOMContentLoaded\", () => {\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n });\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.isCollapsed) {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n"],"names":["constructor","window","listener","this","addEventListener","document","event","onClick","defaultPrevented","selection","getSelection","isCollapsed","target","Element","nearestInteractiveElement","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","tapEvent","x","clientX","y","clientY","JSON","stringify","gestures"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map index 6f23c43b82..ba21ab4111 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map +++ b/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/package.json b/readium/navigators/web/scripts/package.json index ca9eb712d8..b9670beee1 100644 --- a/readium/navigators/web/scripts/package.json +++ b/readium/navigators/web/scripts/package.json @@ -10,7 +10,7 @@ "bundle": "webpack", "lint": "eslint 'src/**'", "checkformat": "prettier --check '**/*.js'", - "format": "prettier --list-different --write '**/*.js'" + "format": "prettier --list-different --write '**/*.js' '**/*.ts'" }, "browserslist": [ "Android >= 4" diff --git a/readium/navigators/web/scripts/src/common/gestures.ts b/readium/navigators/web/scripts/src/common/gestures.ts index 33cab1bab0..19782277ee 100644 --- a/readium/navigators/web/scripts/src/common/gestures.ts +++ b/readium/navigators/web/scripts/src/common/gestures.ts @@ -1,10 +1,8 @@ export interface GesturesListener { - onTap(event: MouseEvent): void } export class GesturesManager { - private readonly listener: GesturesListener private readonly window: Window @@ -13,7 +11,13 @@ export class GesturesManager { this.window = window this.listener = listener window.addEventListener("DOMContentLoaded", () => { - document.addEventListener("click", (event) => { this.onClick(event) }, false) + document.addEventListener( + "click", + (event) => { + this.onClick(event) + }, + false + ) }) } @@ -25,23 +29,26 @@ export class GesturesManager { const selection = this.window.getSelection() if (selection && selection.isCollapsed) { // There's an on-going selection, the tap will dismiss it so we don't forward it. - return; + return } - if (event.target instanceof Element && this.nearestInteractiveElement(event.target)) { + if ( + event.target instanceof Element && + this.nearestInteractiveElement(event.target) + ) { return } - - this.listener.onTap(event); - - event.stopPropagation(); - event.preventDefault(); + + this.listener.onTap(event) + + event.stopPropagation() + event.preventDefault() } // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling private nearestInteractiveElement(element: Element): string | null { if (element == null) { - return null; + return null } const interactiveTags = [ "a", @@ -56,9 +63,9 @@ export class GesturesManager { "submit", "textarea", "video", - ]; + ] if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) { - return element.outerHTML; + return element.outerHTML } // Checks whether the element is editable by the user. @@ -66,14 +73,14 @@ export class GesturesManager { element.hasAttribute("contenteditable") && element.getAttribute("contenteditable")!.toLowerCase() != "false" ) { - return element.outerHTML; + return element.outerHTML } // Checks parents recursively because the touch might be for example on an inside a . if (element.parentElement) { - return this.nearestInteractiveElement(element.parentElement); + return this.nearestInteractiveElement(element.parentElement) } - return null; + return null } } diff --git a/readium/navigators/web/scripts/src/common/types.ts b/readium/navigators/web/scripts/src/common/types.ts index eb20448800..094b35f76d 100644 --- a/readium/navigators/web/scripts/src/common/types.ts +++ b/readium/navigators/web/scripts/src/common/types.ts @@ -4,15 +4,15 @@ export interface Size { } export interface Margins { - top: number, - left: number, - bottom: number, + top: number + left: number + bottom: number right: number } export interface Insets { - top: number, - left: number, - bottom: number, + top: number + left: number + bottom: number right: number } diff --git a/readium/navigators/web/scripts/src/index-prepaginated-double.ts b/readium/navigators/web/scripts/src/index-prepaginated-double.ts index c9d267a63e..454b34a799 100644 --- a/readium/navigators/web/scripts/src/index-prepaginated-double.ts +++ b/readium/navigators/web/scripts/src/index-prepaginated-double.ts @@ -4,56 +4,56 @@ // available in the top-level LICENSE file of the project. // -import { Insets, Size } from "./common/types"; -import { DoubleAreaManager } from "./prepaginated/double-area-manager"; -import { Fit } from "./util/fit"; +import { Insets, Size } from "./common/types" +import { DoubleAreaManager } from "./prepaginated/double-area-manager" +import { Fit } from "./util/fit" namespace Layout { + const leftIframe = document.getElementById("page-left") as HTMLIFrameElement - const leftIframe = document.getElementById("page-left") as HTMLIFrameElement; + const rightIframe = document.getElementById("page-right") as HTMLIFrameElement - const rightIframe = document.getElementById("page-right") as HTMLIFrameElement; + const metaViewport = document.querySelector( + "meta[name=viewport]" + ) as HTMLMetaElement - const metaViewport = document.querySelector("meta[name=viewport]") as HTMLMetaElement; + const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport) - const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport); + export function loadSpread(spread: { left?: string; right?: string }) { + manager.loadSpread(spread) + } - export function loadSpread( - spread: { left?: string, right?: string } + export function setViewport( + viewporttWidth: number, + viewportHeight: number, + insetTop: number, + insetRight: number, + insetBottom: number, + insetLeft: number ) { - manager.loadSpread(spread) + const viewport: Size = { width: viewporttWidth, height: viewportHeight } + const insets: Insets = { + top: insetTop, + left: insetLeft, + bottom: insetBottom, + right: insetRight, + } + manager.setViewport(viewport, insets) } - export function setViewport( - viewporttWidth: number, - viewportHeight: number, - insetTop: number, - insetRight: number, - insetBottom: number, - insetLeft: number, - ) { - const viewport: Size = { width: viewporttWidth, height: viewportHeight} - const insets: Insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight } - manager.setViewport(viewport, insets) - } - - export function setFit( - fit: string - ) { - if (fit != "contain" && fit != "width" && fit != "height") { - throw Error(`Invalid fit value: ${fit}`) - } - - manager.setFit(fit as Fit) + export function setFit(fit: string) { + if (fit != "contain" && fit != "width" && fit != "height") { + throw Error(`Invalid fit value: ${fit}`) + } + + manager.setFit(fit as Fit) } } declare global { - - interface Window { - - layout: any - } + interface Window { + layout: any + } } Window.prototype.layout = Layout diff --git a/readium/navigators/web/scripts/src/index-prepaginated-injectable.ts b/readium/navigators/web/scripts/src/index-prepaginated-injectable.ts index ca85931cd8..d9a3d04aa4 100644 --- a/readium/navigators/web/scripts/src/index-prepaginated-injectable.ts +++ b/readium/navigators/web/scripts/src/index-prepaginated-injectable.ts @@ -1,38 +1,32 @@ -import { GesturesManager, GesturesListener } from "./common/gestures"; +import { GesturesManager, GesturesListener } from "./common/gestures" interface Listener { - - onTap(event: string): void - + onTap(event: string): void } interface TapEvent { + x: number - x: number - - y: number + y: number } declare global { - - interface Window { - - gestures: Listener - } + interface Window { + gestures: Listener + } } class AdapterGesturesListener implements GesturesListener { + readonly listener: Listener - readonly listener: Listener - - constructor(listener: Listener) { - this.listener = listener - } + constructor(listener: Listener) { + this.listener = listener + } - onTap(event: MouseEvent): void { - const tapEvent: TapEvent = { x: event.clientX, y: event.clientY } - this.listener.onTap(JSON.stringify(tapEvent)) - } + onTap(event: MouseEvent): void { + const tapEvent: TapEvent = { x: event.clientX, y: event.clientY } + this.listener.onTap(JSON.stringify(tapEvent)) + } } new GesturesManager(window, new AdapterGesturesListener(window.gestures)) diff --git a/readium/navigators/web/scripts/src/index-prepaginated-single.ts b/readium/navigators/web/scripts/src/index-prepaginated-single.ts index f94452ce8e..65603ade38 100644 --- a/readium/navigators/web/scripts/src/index-prepaginated-single.ts +++ b/readium/navigators/web/scripts/src/index-prepaginated-single.ts @@ -4,14 +4,12 @@ // available in the top-level LICENSE file of the project. // -import { Insets, Size } from "./common/types"; -import { Fit } from "./util/fit"; -import { SingleAreaManager } from "./prepaginated/single-area-manager"; +import { Insets, Size } from "./common/types" +import { Fit } from "./util/fit" +import { SingleAreaManager } from "./prepaginated/single-area-manager" // Script used for the single spread wrapper HTML page for fixed layout resources. - - /*class WebListener implements SingleAreaManager.Listener{ onError(error: SingleAreaManager.Error): void { @@ -22,54 +20,50 @@ import { SingleAreaManager } from "./prepaginated/single-area-manager"; //declare let listener: FixedPageManager.Listener const listener = new WebListener();*/ - namespace Layout { - - const iframe = document.getElementById("page") as HTMLIFrameElement; - - const metaViewport = document.querySelector("meta[name=viewport]") as HTMLMetaElement; - - const manager = new SingleAreaManager(iframe, metaViewport); - - - export function loadResource( - url: string - ) { - manager.loadResource(url); - } - - export function setViewport( - viewporttWidth: number, - viewportHeight: number, - insetTop: number, - insetRight: number, - insetBottom: number, - insetLeft: number, - - ) { - const viewport: Size = { width: viewporttWidth, height: viewportHeight}; - const insets: Insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight }; - manager.setViewport(viewport, insets); - } - - export function setFit( - fit: string - ) { - if (fit != "contain" && fit != "width" && fit != "height") { - throw Error(`Invalid fit value: ${fit}`) - } - - manager.setFit(fit as Fit); - } + const iframe = document.getElementById("page") as HTMLIFrameElement + + const metaViewport = document.querySelector( + "meta[name=viewport]" + ) as HTMLMetaElement + + const manager = new SingleAreaManager(iframe, metaViewport) + + export function loadResource(url: string) { + manager.loadResource(url) + } + + export function setViewport( + viewporttWidth: number, + viewportHeight: number, + insetTop: number, + insetRight: number, + insetBottom: number, + insetLeft: number + ) { + const viewport: Size = { width: viewporttWidth, height: viewportHeight } + const insets: Insets = { + top: insetTop, + left: insetLeft, + bottom: insetBottom, + right: insetRight, + } + manager.setViewport(viewport, insets) + } + + export function setFit(fit: string) { + if (fit != "contain" && fit != "width" && fit != "height") { + throw Error(`Invalid fit value: ${fit}`) + } + + manager.setFit(fit as Fit) + } } declare global { - - interface Window { - - layout: any - } + interface Window { + layout: any + } } Window.prototype.layout = Layout - diff --git a/readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts b/readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts index 2dc514cd4f..6d67f25f2f 100644 --- a/readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts +++ b/readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts @@ -1,11 +1,9 @@ - import { Size, Insets } from "../common/types" import { computeScale, Fit } from "../util/fit" import { PageManager } from "./page-manager" import { ViewportStringBuilder } from "../util/viewport" export class DoubleAreaManager { - private readonly metaViewport: HTMLMetaElement private readonly leftPage: PageManager @@ -18,20 +16,24 @@ export class DoubleAreaManager { private viewport?: Size - private spread?: { left?: string, right?: string } + private spread?: { left?: string; right?: string } constructor( leftIframe: HTMLIFrameElement, rightIframe: HTMLIFrameElement, metaViewport: HTMLMetaElement ) { - const listener = { onIframeLoaded: () => { this.layout() } } + const listener = { + onIframeLoaded: () => { + this.layout() + }, + } this.leftPage = new PageManager(leftIframe, listener) this.rightPage = new PageManager(rightIframe, listener) this.metaViewport = metaViewport } - loadSpread(spread: { left?: string, right?: string }) { + loadSpread(spread: { left?: string; right?: string }) { this.leftPage.hide() this.rightPage.hide() this.spread = spread @@ -66,31 +68,43 @@ export class DoubleAreaManager { private layout() { if ( - !this.viewport || + !this.viewport || (!this.leftPage.size && this.spread!.left) || (!this.rightPage.size && this.spread!.right) - ) { + ) { return } - const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left } + const leftMargins = { + top: this.insets.top, + right: 0, + bottom: this.insets.bottom, + left: this.insets.left, + } this.leftPage.setMargins(leftMargins) - const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 } + const rightMargins = { + top: this.insets.top, + right: this.insets.right, + bottom: this.insets.bottom, + left: 0, + } this.rightPage.setMargins(rightMargins) if (!this.spread!.right) { this.rightPage.setPlaceholder(this.leftPage.size!) - } else if (!this.spread!.left) { this.leftPage.setPlaceholder(this.rightPage.size!) } const contentWidth = this.leftPage.size!.width + this.rightPage.size!.width - const contentHeight = Math.max(this.leftPage.size!.height, this.rightPage.size!.height) + const contentHeight = Math.max( + this.leftPage.size!.height, + this.rightPage.size!.height + ) const contentSize = { width: contentWidth, height: contentHeight } const safeDrawingSize = { width: this.viewport.width - this.insets.left - this.insets.right, - height: this.viewport.height - this.insets.top - this.insets.bottom + height: this.viewport.height - this.insets.top - this.insets.bottom, } const scale = computeScale(this.fit, contentSize, safeDrawingSize) diff --git a/readium/navigators/web/scripts/src/prepaginated/page-manager.ts b/readium/navigators/web/scripts/src/prepaginated/page-manager.ts index a350c31c16..69ac333403 100644 --- a/readium/navigators/web/scripts/src/prepaginated/page-manager.ts +++ b/readium/navigators/web/scripts/src/prepaginated/page-manager.ts @@ -1,8 +1,7 @@ -import {Margins, Size} from "../common/types" +import { Margins, Size } from "../common/types" /** Manages a fixed layout resource embedded in an iframe. */ export class PageManager { - private readonly iframe: HTMLIFrameElement private readonly listener: PageManager.Listener @@ -18,7 +17,9 @@ export class PageManager { this.listener = listener this.iframe = iframe - this.iframe.addEventListener("load", () => { this.onIframeLoaded() }) + this.iframe.addEventListener("load", () => { + this.onIframeLoaded() + }) } show() { @@ -48,44 +49,46 @@ export class PageManager { /** Sets the size of this page without content. */ setPlaceholder(size: Size) { - this.iframe.style.width = size.width + "px"; - this.iframe.style.height = size.height + "px"; + this.iframe.style.width = size.width + "px" + this.iframe.style.height = size.height + "px" this.size = size } private onIframeLoaded() { - const viewport = this.iframe.contentWindow!.document.querySelector("meta[name=viewport]") - if (!viewport || viewport !instanceof HTMLMetaElement) { + const viewport = this.iframe.contentWindow!.document.querySelector( + "meta[name=viewport]" + ) + if (!viewport || viewport! instanceof HTMLMetaElement) { //FIXME: handle edge case - return; + return } - const pageSize = this.parsePageSize(viewport as HTMLMetaElement); + const pageSize = this.parsePageSize(viewport as HTMLMetaElement) if (!pageSize) { //FIXME: handle edge case return } - this.iframe.style.width = pageSize.width + "px"; - this.iframe.style.height = pageSize.height + "px"; + this.iframe.style.width = pageSize.width + "px" + this.iframe.style.height = pageSize.height + "px" this.size = pageSize - this.listener.onIframeLoaded() + this.listener.onIframeLoaded() } /** Parses the page size from the viewport meta tag of the loaded resource. */ private parsePageSize(viewportMeta: HTMLMetaElement): Size | undefined { - const regex = /(\w+) *= *([^\s,]+)/g; - const properties = new Map(); - let match; + const regex = /(\w+) *= *([^\s,]+)/g + const properties = new Map() + let match while ((match = regex.exec(viewportMeta.content))) { if (match != null) { - properties.set(match[1], match[2]); + properties.set(match[1], match[2]) } } - const width = parseFloat(properties.get("width")); - const height = parseFloat(properties.get("height")); + const width = parseFloat(properties.get("width")) + const height = parseFloat(properties.get("height")) if (width && height) { - return { width, height }; + return { width, height } } else { return undefined } @@ -93,9 +96,7 @@ export class PageManager { } export namespace PageManager { - export interface Listener { - onIframeLoaded(): void - } + } } diff --git a/readium/navigators/web/scripts/src/prepaginated/single-area-manager.ts b/readium/navigators/web/scripts/src/prepaginated/single-area-manager.ts index 4826fcfdd5..80a743fa44 100644 --- a/readium/navigators/web/scripts/src/prepaginated/single-area-manager.ts +++ b/readium/navigators/web/scripts/src/prepaginated/single-area-manager.ts @@ -4,7 +4,6 @@ import { PageManager } from "./page-manager" import { ViewportStringBuilder } from "../util/viewport" export class SingleAreaManager { - private readonly metaViewport: HTMLMetaElement private readonly page: PageManager @@ -17,7 +16,11 @@ export class SingleAreaManager { constructor(iframe: HTMLIFrameElement, metaViewport: HTMLMetaElement) { this.metaViewport = metaViewport - const listener = { onIframeLoaded: () => { this.onIframeLoaded() } } + const listener = { + onIframeLoaded: () => { + this.onIframeLoaded() + }, + } this.page = new PageManager(iframe, listener) } @@ -50,7 +53,7 @@ export class SingleAreaManager { // FIXME: raise error } else { this.layout() - } + } } private layout() { @@ -60,23 +63,23 @@ export class SingleAreaManager { const margins = { top: this.insets.top, - right: this.insets.right, + right: this.insets.right, bottom: this.insets.bottom, - left: this.insets.left + left: this.insets.left, } this.page.setMargins(margins) const safeDrawingSize = { width: this.viewport.width - this.insets.left - this.insets.right, - height: this.viewport.height - this.insets.top - this.insets.bottom + height: this.viewport.height - this.insets.top - this.insets.bottom, } const scale = computeScale(this.fit, this.page.size, safeDrawingSize) this.metaViewport.content = new ViewportStringBuilder() - .setInitialScale(scale) - .setMinimumScale(scale) - .setWidth(this.page.size.width) - .setHeight(this.page.size.height) - .build() + .setInitialScale(scale) + .setMinimumScale(scale) + .setWidth(this.page.size.width) + .setHeight(this.page.size.height) + .build() this.page.show() } diff --git a/readium/navigators/web/scripts/src/util/fit.ts b/readium/navigators/web/scripts/src/util/fit.ts index df6ed46bc1..d33258b5cb 100644 --- a/readium/navigators/web/scripts/src/util/fit.ts +++ b/readium/navigators/web/scripts/src/util/fit.ts @@ -1,33 +1,32 @@ -import { Size } from "../common/types"; - +import { Size } from "../common/types" export const enum Fit { - Contain = "contain", - Width = "width", - Height = "height" + Contain = "contain", + Width = "width", + Height = "height", } export function computeScale(fit: Fit, content: Size, container: Size): number { switch (fit) { case Fit.Contain: - return fitContain(content, container); + return fitContain(content, container) case Fit.Width: - return fitWidth(content, container); + return fitWidth(content, container) case Fit.Height: - return fitHeight(content, container); + return fitHeight(content, container) } } function fitContain(content: Size, container: Size): number { - const widthRatio = container.width / content.width; - const heightRatio = container.height / content.height; - return Math.min(widthRatio, heightRatio); + const widthRatio = container.width / content.width + const heightRatio = container.height / content.height + return Math.min(widthRatio, heightRatio) } function fitWidth(content: Size, container: Size): number { - return container.width / content.width; + return container.width / content.width } function fitHeight(content: Size, container: Size): number { - return container.height / content.height; + return container.height / content.height } diff --git a/readium/navigators/web/scripts/src/util/viewport.ts b/readium/navigators/web/scripts/src/util/viewport.ts index e27fd9249e..0482441f93 100644 --- a/readium/navigators/web/scripts/src/util/viewport.ts +++ b/readium/navigators/web/scripts/src/util/viewport.ts @@ -1,5 +1,4 @@ -export class ViewportStringBuilder{ - +export class ViewportStringBuilder { private initialScale?: number private minimumScale?: number @@ -8,7 +7,6 @@ export class ViewportStringBuilder{ private height?: number - setInitialScale(scale: number): ViewportStringBuilder { this.initialScale = scale return this @@ -41,11 +39,11 @@ export class ViewportStringBuilder{ } if (this.width) { - components.push("width=" + this.width ) + components.push("width=" + this.width) } if (this.height) { - components.push("height=" + this.height ) + components.push("height=" + this.height) } return components.join(", ") diff --git a/readium/navigators/web/scripts/webpack.config.js b/readium/navigators/web/scripts/webpack.config.js index 89bcde9150..24986431b6 100644 --- a/readium/navigators/web/scripts/webpack.config.js +++ b/readium/navigators/web/scripts/webpack.config.js @@ -1,5 +1,5 @@ -const path = require("path"); -const CopyPlugin = require("copy-webpack-plugin"); +const path = require("path") +const CopyPlugin = require("copy-webpack-plugin") module.exports = { mode: "production", @@ -37,4 +37,4 @@ module.exports = { patterns: [{ from: "public" }], }), ], -}; +} diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map index c93825de7e..4eac876379 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = { onIframeLoaded: () => { this.layout(); } };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = { top: this.insets.top, right: 0, bottom: this.insets.bottom, left: this.insets.left };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = { top: this.insets.top, right: this.insets.right, bottom: this.insets.bottom, left: 0 };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = {\n onIframeLoaded: () => {\n this.layout();\n },\n };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js.map index 3f72da9906..c91b43cb01 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-injectable-script.js","mappings":"yBAUA,ICVO,MACH,WAAAA,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBD,EAAOG,iBAAiB,oBAAoB,KACxCC,SAASD,iBAAiB,SAAUE,IAAYH,KAAKI,QAAQD,EAAM,IAAK,EAAM,GAEtF,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC1BD,GAAaA,EAAUE,aAIvBL,EAAMM,kBAAkBC,SAAWV,KAAKW,0BAA0BR,EAAMM,UAG5ET,KAAKD,SAASa,MAAMT,GACpBA,EAAMU,kBACNV,EAAMW,iBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAAQM,UAQfN,EAAQO,cACDtB,KAAKW,0BAA0BI,EAAQO,eAE3C,IACX,GD9CgBxB,OAAQ,IAT5B,MACI,WAAAD,CAAYE,GACRC,KAAKD,SAAWA,CACpB,CACA,KAAAa,CAAMT,GACF,MAAMoB,EAAW,CAAEC,EAAGrB,EAAMsB,QAASC,EAAGvB,EAAMwB,SAC9C3B,KAAKD,SAASa,MAAMgB,KAAKC,UAAUN,GACvC,GAEoDzB,OAAOgC,U","sources":["webpack://readium-js/./src/index-prepaginated-injectable.ts","webpack://readium-js/./src/common/gestures.ts"],"sourcesContent":["import { GesturesManager } from \"./common/gestures\";\nclass AdapterGesturesListener {\n constructor(listener) {\n this.listener = listener;\n }\n onTap(event) {\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.listener.onTap(JSON.stringify(tapEvent));\n }\n}\nnew GesturesManager(window, new AdapterGesturesListener(window.gestures));\n","export class GesturesManager {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n window.addEventListener(\"DOMContentLoaded\", () => {\n document.addEventListener(\"click\", (event) => { this.onClick(event); }, false);\n });\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.isCollapsed) {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n return;\n }\n if (event.target instanceof Element && this.nearestInteractiveElement(event.target)) {\n return;\n }\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n"],"names":["constructor","window","listener","this","addEventListener","document","event","onClick","defaultPrevented","selection","getSelection","isCollapsed","target","Element","nearestInteractiveElement","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","tapEvent","x","clientX","y","clientY","JSON","stringify","gestures"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-injectable-script.js","mappings":"yBAUA,ICVO,MACH,WAAAA,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBD,EAAOG,iBAAiB,oBAAoB,KACxCC,SAASD,iBAAiB,SAAUE,IAChCH,KAAKI,QAAQD,EAAM,IACpB,EAAM,GAEjB,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC1BD,GAAaA,EAAUE,aAIvBL,EAAMM,kBAAkBC,SACxBV,KAAKW,0BAA0BR,EAAMM,UAGzCT,KAAKD,SAASa,MAAMT,GACpBA,EAAMU,kBACNV,EAAMW,iBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAAQM,UAQfN,EAAQO,cACDtB,KAAKW,0BAA0BI,EAAQO,eAE3C,IACX,GDjDgBxB,OAAQ,IAT5B,MACI,WAAAD,CAAYE,GACRC,KAAKD,SAAWA,CACpB,CACA,KAAAa,CAAMT,GACF,MAAMoB,EAAW,CAAEC,EAAGrB,EAAMsB,QAASC,EAAGvB,EAAMwB,SAC9C3B,KAAKD,SAASa,MAAMgB,KAAKC,UAAUN,GACvC,GAEoDzB,OAAOgC,U","sources":["webpack://readium-js/./src/index-prepaginated-injectable.ts","webpack://readium-js/./src/common/gestures.ts"],"sourcesContent":["import { GesturesManager } from \"./common/gestures\";\nclass AdapterGesturesListener {\n constructor(listener) {\n this.listener = listener;\n }\n onTap(event) {\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.listener.onTap(JSON.stringify(tapEvent));\n }\n}\nnew GesturesManager(window, new AdapterGesturesListener(window.gestures));\n","export class GesturesManager {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n window.addEventListener(\"DOMContentLoaded\", () => {\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n });\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.isCollapsed) {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n"],"names":["constructor","window","listener","this","addEventListener","document","event","onClick","defaultPrevented","selection","getSelection","isCollapsed","target","Element","nearestInteractiveElement","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","tapEvent","x","clientX","y","clientY","JSON","stringify","gestures"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map index 6f23c43b82..ba21ab4111 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => { this.onIframeLoaded(); });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = { onIframeLoaded: () => { this.onIframeLoaded(); } };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = { top: insetTop, left: insetLeft, bottom: insetBottom, right: insetRight };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","Window","prototype"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","Window","prototype"],"sourceRoot":""} \ No newline at end of file From 042f70dc897199083b452f4082a92a094d4f0d5a Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 25 Sep 2024 14:57:34 +0200 Subject: [PATCH 38/61] Fix taps in resource iframes. --- .../web/scripts/dist/prepaginated-injectable-script.js | 2 +- .../web/scripts/dist/prepaginated-injectable-script.js.map | 2 +- readium/navigators/web/scripts/src/common/gestures.ts | 4 +++- .../readium/navigators/web/prepaginated-injectable-script.js | 2 +- .../navigators/web/prepaginated-injectable-script.js.map | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js b/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js index 9cbd72d6d4..ab10035621 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js +++ b/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";new class{constructor(e,t){this.window=e,this.listener=t,e.addEventListener("DOMContentLoaded",(()=>{document.addEventListener("click",(e=>{this.onClick(e)}),!1)}))}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();t&&t.isCollapsed||e.target instanceof Element&&this.nearestInteractiveElement(e.target)||(this.listener.onTap(e),e.stopPropagation(),e.preventDefault())}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e.outerHTML:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}(window,new class{constructor(e){this.listener=e}onTap(e){const t={x:e.clientX,y:e.clientY};this.listener.onTap(JSON.stringify(t))}}(window.gestures))}(); +!function(){"use strict";new class{constructor(e,t){this.window=e,this.listener=t,e.addEventListener("DOMContentLoaded",(()=>{document.addEventListener("click",(e=>{this.onClick(e)}),!1)}))}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();t&&"Range"==t.type||e.target instanceof Element&&this.nearestInteractiveElement(e.target)||(this.listener.onTap(e),e.stopPropagation(),e.preventDefault())}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e.outerHTML:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}(window,new class{constructor(e){this.listener=e}onTap(e){const t={x:e.clientX,y:e.clientY};this.listener.onTap(JSON.stringify(t))}}(window.gestures))}(); //# sourceMappingURL=prepaginated-injectable-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js.map index c91b43cb01..f7facf1ed7 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js.map +++ b/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-injectable-script.js","mappings":"yBAUA,ICVO,MACH,WAAAA,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBD,EAAOG,iBAAiB,oBAAoB,KACxCC,SAASD,iBAAiB,SAAUE,IAChCH,KAAKI,QAAQD,EAAM,IACpB,EAAM,GAEjB,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC1BD,GAAaA,EAAUE,aAIvBL,EAAMM,kBAAkBC,SACxBV,KAAKW,0BAA0BR,EAAMM,UAGzCT,KAAKD,SAASa,MAAMT,GACpBA,EAAMU,kBACNV,EAAMW,iBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAAQM,UAQfN,EAAQO,cACDtB,KAAKW,0BAA0BI,EAAQO,eAE3C,IACX,GDjDgBxB,OAAQ,IAT5B,MACI,WAAAD,CAAYE,GACRC,KAAKD,SAAWA,CACpB,CACA,KAAAa,CAAMT,GACF,MAAMoB,EAAW,CAAEC,EAAGrB,EAAMsB,QAASC,EAAGvB,EAAMwB,SAC9C3B,KAAKD,SAASa,MAAMgB,KAAKC,UAAUN,GACvC,GAEoDzB,OAAOgC,U","sources":["webpack://readium-js/./src/index-prepaginated-injectable.ts","webpack://readium-js/./src/common/gestures.ts"],"sourcesContent":["import { GesturesManager } from \"./common/gestures\";\nclass AdapterGesturesListener {\n constructor(listener) {\n this.listener = listener;\n }\n onTap(event) {\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.listener.onTap(JSON.stringify(tapEvent));\n }\n}\nnew GesturesManager(window, new AdapterGesturesListener(window.gestures));\n","export class GesturesManager {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n window.addEventListener(\"DOMContentLoaded\", () => {\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n });\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.isCollapsed) {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n"],"names":["constructor","window","listener","this","addEventListener","document","event","onClick","defaultPrevented","selection","getSelection","isCollapsed","target","Element","nearestInteractiveElement","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","tapEvent","x","clientX","y","clientY","JSON","stringify","gestures"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-injectable-script.js","mappings":"yBAUA,ICVO,MACH,WAAAA,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBD,EAAOG,iBAAiB,oBAAoB,KACxCC,SAASD,iBAAiB,SAAUE,IAChCH,KAAKI,QAAQD,EAAM,IACpB,EAAM,GAEjB,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC1BD,GAA+B,SAAlBA,EAAUE,MAMvBL,EAAMM,kBAAkBC,SACxBV,KAAKW,0BAA0BR,EAAMM,UAGzCT,KAAKD,SAASa,MAAMT,GACpBA,EAAMU,kBACNV,EAAMW,iBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAAQM,UAQfN,EAAQO,cACDtB,KAAKW,0BAA0BI,EAAQO,eAE3C,IACX,GDnDgBxB,OAAQ,IAT5B,MACI,WAAAD,CAAYE,GACRC,KAAKD,SAAWA,CACpB,CACA,KAAAa,CAAMT,GACF,MAAMoB,EAAW,CAAEC,EAAGrB,EAAMsB,QAASC,EAAGvB,EAAMwB,SAC9C3B,KAAKD,SAASa,MAAMgB,KAAKC,UAAUN,GACvC,GAEoDzB,OAAOgC,U","sources":["webpack://readium-js/./src/index-prepaginated-injectable.ts","webpack://readium-js/./src/common/gestures.ts"],"sourcesContent":["import { GesturesManager } from \"./common/gestures\";\nclass AdapterGesturesListener {\n constructor(listener) {\n this.listener = listener;\n }\n onTap(event) {\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.listener.onTap(JSON.stringify(tapEvent));\n }\n}\nnew GesturesManager(window, new AdapterGesturesListener(window.gestures));\n","export class GesturesManager {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n window.addEventListener(\"DOMContentLoaded\", () => {\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n });\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n"],"names":["constructor","window","listener","this","addEventListener","document","event","onClick","defaultPrevented","selection","getSelection","type","target","Element","nearestInteractiveElement","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","tapEvent","x","clientX","y","clientY","JSON","stringify","gestures"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/src/common/gestures.ts b/readium/navigators/web/scripts/src/common/gestures.ts index 19782277ee..cf1a00e82d 100644 --- a/readium/navigators/web/scripts/src/common/gestures.ts +++ b/readium/navigators/web/scripts/src/common/gestures.ts @@ -27,8 +27,10 @@ export class GesturesManager { } const selection = this.window.getSelection() - if (selection && selection.isCollapsed) { + if (selection && selection.type == "Range") { // There's an on-going selection, the tap will dismiss it so we don't forward it. + // selection.type might be None (collapsed) or Caret with a collapsed range + // when there is not true selection. return } diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js index 9cbd72d6d4..ab10035621 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";new class{constructor(e,t){this.window=e,this.listener=t,e.addEventListener("DOMContentLoaded",(()=>{document.addEventListener("click",(e=>{this.onClick(e)}),!1)}))}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();t&&t.isCollapsed||e.target instanceof Element&&this.nearestInteractiveElement(e.target)||(this.listener.onTap(e),e.stopPropagation(),e.preventDefault())}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e.outerHTML:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}(window,new class{constructor(e){this.listener=e}onTap(e){const t={x:e.clientX,y:e.clientY};this.listener.onTap(JSON.stringify(t))}}(window.gestures))}(); +!function(){"use strict";new class{constructor(e,t){this.window=e,this.listener=t,e.addEventListener("DOMContentLoaded",(()=>{document.addEventListener("click",(e=>{this.onClick(e)}),!1)}))}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();t&&"Range"==t.type||e.target instanceof Element&&this.nearestInteractiveElement(e.target)||(this.listener.onTap(e),e.stopPropagation(),e.preventDefault())}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e.outerHTML:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}(window,new class{constructor(e){this.listener=e}onTap(e){const t={x:e.clientX,y:e.clientY};this.listener.onTap(JSON.stringify(t))}}(window.gestures))}(); //# sourceMappingURL=prepaginated-injectable-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js.map index c91b43cb01..f7facf1ed7 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js.map @@ -1 +1 @@ -{"version":3,"file":"prepaginated-injectable-script.js","mappings":"yBAUA,ICVO,MACH,WAAAA,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBD,EAAOG,iBAAiB,oBAAoB,KACxCC,SAASD,iBAAiB,SAAUE,IAChCH,KAAKI,QAAQD,EAAM,IACpB,EAAM,GAEjB,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC1BD,GAAaA,EAAUE,aAIvBL,EAAMM,kBAAkBC,SACxBV,KAAKW,0BAA0BR,EAAMM,UAGzCT,KAAKD,SAASa,MAAMT,GACpBA,EAAMU,kBACNV,EAAMW,iBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAAQM,UAQfN,EAAQO,cACDtB,KAAKW,0BAA0BI,EAAQO,eAE3C,IACX,GDjDgBxB,OAAQ,IAT5B,MACI,WAAAD,CAAYE,GACRC,KAAKD,SAAWA,CACpB,CACA,KAAAa,CAAMT,GACF,MAAMoB,EAAW,CAAEC,EAAGrB,EAAMsB,QAASC,EAAGvB,EAAMwB,SAC9C3B,KAAKD,SAASa,MAAMgB,KAAKC,UAAUN,GACvC,GAEoDzB,OAAOgC,U","sources":["webpack://readium-js/./src/index-prepaginated-injectable.ts","webpack://readium-js/./src/common/gestures.ts"],"sourcesContent":["import { GesturesManager } from \"./common/gestures\";\nclass AdapterGesturesListener {\n constructor(listener) {\n this.listener = listener;\n }\n onTap(event) {\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.listener.onTap(JSON.stringify(tapEvent));\n }\n}\nnew GesturesManager(window, new AdapterGesturesListener(window.gestures));\n","export class GesturesManager {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n window.addEventListener(\"DOMContentLoaded\", () => {\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n });\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.isCollapsed) {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n"],"names":["constructor","window","listener","this","addEventListener","document","event","onClick","defaultPrevented","selection","getSelection","isCollapsed","target","Element","nearestInteractiveElement","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","tapEvent","x","clientX","y","clientY","JSON","stringify","gestures"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"prepaginated-injectable-script.js","mappings":"yBAUA,ICVO,MACH,WAAAA,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBD,EAAOG,iBAAiB,oBAAoB,KACxCC,SAASD,iBAAiB,SAAUE,IAChCH,KAAKI,QAAQD,EAAM,IACpB,EAAM,GAEjB,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC1BD,GAA+B,SAAlBA,EAAUE,MAMvBL,EAAMM,kBAAkBC,SACxBV,KAAKW,0BAA0BR,EAAMM,UAGzCT,KAAKD,SAASa,MAAMT,GACpBA,EAAMU,kBACNV,EAAMW,iBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAAQM,UAQfN,EAAQO,cACDtB,KAAKW,0BAA0BI,EAAQO,eAE3C,IACX,GDnDgBxB,OAAQ,IAT5B,MACI,WAAAD,CAAYE,GACRC,KAAKD,SAAWA,CACpB,CACA,KAAAa,CAAMT,GACF,MAAMoB,EAAW,CAAEC,EAAGrB,EAAMsB,QAASC,EAAGvB,EAAMwB,SAC9C3B,KAAKD,SAASa,MAAMgB,KAAKC,UAAUN,GACvC,GAEoDzB,OAAOgC,U","sources":["webpack://readium-js/./src/index-prepaginated-injectable.ts","webpack://readium-js/./src/common/gestures.ts"],"sourcesContent":["import { GesturesManager } from \"./common/gestures\";\nclass AdapterGesturesListener {\n constructor(listener) {\n this.listener = listener;\n }\n onTap(event) {\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.listener.onTap(JSON.stringify(tapEvent));\n }\n}\nnew GesturesManager(window, new AdapterGesturesListener(window.gestures));\n","export class GesturesManager {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n window.addEventListener(\"DOMContentLoaded\", () => {\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n });\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n"],"names":["constructor","window","listener","this","addEventListener","document","event","onClick","defaultPrevented","selection","getSelection","type","target","Element","nearestInteractiveElement","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","tapEvent","x","clientX","y","clientY","JSON","stringify","gestures"],"sourceRoot":""} \ No newline at end of file From e3e7ff6e49682bcb2eb34984f40656bc7b2419a3 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Thu, 26 Sep 2024 07:46:12 +0200 Subject: [PATCH 39/61] Fix theme --- .../readium/navigator/demo/DemoActivity.kt | 4 +-- .../org/readium/navigator/demo/util/Theme.kt | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Theme.kt diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt index 3d559e6326..6b946fbfac 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt @@ -13,7 +13,6 @@ import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -21,6 +20,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.core.view.WindowCompat import org.readium.navigator.demo.util.Fullscreenable +import org.readium.navigator.demo.util.Theme import org.readium.r2.shared.util.toAbsoluteUrl class DemoActivity : ComponentActivity() { @@ -40,7 +40,7 @@ class DemoActivity : ComponentActivity() { enableEdgeToEdge() setContent { - MaterialTheme { + Theme { val fullscreenState = remember { mutableStateOf(false) } Fullscreenable( diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Theme.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Theme.kt new file mode 100644 index 0000000000..5e40b53c6f --- /dev/null +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Theme.kt @@ -0,0 +1,26 @@ +package org.readium.navigator.demo.util + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable + +@Composable +fun Theme( + darkTheme: Boolean = isSystemInDarkTheme(), + content: @Composable () -> Unit +) { + val colors = if (darkTheme) { + darkColorScheme() + } else { + lightColorScheme() + } + + MaterialTheme( + colorScheme = colors, + shapes = MaterialTheme.shapes, + typography = MaterialTheme.typography, + content = content + ) +} From 93248cf7879488cbe5255ec84df0b60d4b12e9de Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Thu, 26 Sep 2024 08:19:12 +0200 Subject: [PATCH 40/61] Add support for background color --- .../java/org/readium/navigator/demo/DemoActivity.kt | 13 +++++++++++++ .../web/scripts/dist/prepaginated-double-index.html | 4 ++-- .../scripts/public/prepaginated-double-index.html | 4 ++-- .../navigators/web/prepaginated-double-index.html | 4 ++-- .../org/readium/navigator/web/FixedWebNavigator.kt | 9 +++++++-- .../navigator/web/spread/DoubleViewportSpread.kt | 7 +++++-- .../navigator/web/spread/SingleViewportSpread.kt | 7 +++++-- .../readium/navigator/web/spread/SpreadWebView.kt | 6 +++++- .../navigator/web/webview/ComposableWebView.kt | 4 +++- 9 files changed, 44 insertions(+), 14 deletions(-) diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt index 6b946fbfac..ecc471fa2a 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt @@ -13,11 +13,15 @@ import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier import androidx.core.view.WindowCompat import org.readium.navigator.demo.util.Fullscreenable import org.readium.navigator.demo.util.Theme @@ -61,12 +65,14 @@ class DemoActivity : ComponentActivity() { when (val stateNow = state.value) { DemoViewModel.State.BookSelection -> { + Placeholder() LaunchedEffect(stateNow) { sharedStoragePickerLauncher.launch(arrayOf("*/*")) } } is DemoViewModel.State.Error -> { + Placeholder() LaunchedEffect(stateNow.error) { snackbarHostState.showSnackbar(stateNow.error.message) viewModel.acknowledgeError() @@ -74,6 +80,7 @@ class DemoActivity : ComponentActivity() { } DemoViewModel.State.Loading -> { + Placeholder() // Display and do nothing } @@ -88,4 +95,10 @@ class DemoActivity : ComponentActivity() { } } } + + // This is useful for setting a background color. + @Composable + private fun Placeholder() { + Surface(modifier = Modifier.fillMaxSize()) {} + } } diff --git a/readium/navigators/web/scripts/dist/prepaginated-double-index.html b/readium/navigators/web/scripts/dist/prepaginated-double-index.html index b97f7653fb..d6041ae251 100644 --- a/readium/navigators/web/scripts/dist/prepaginated-double-index.html +++ b/readium/navigators/web/scripts/dist/prepaginated-double-index.html @@ -12,7 +12,7 @@ body, html { height: 100%; width: 100%; - background: transparent; + background-color: transparent; } .viewport { @@ -24,7 +24,7 @@ width: 0px; height: 0px; border: none; - background: white; + background-color: white; } diff --git a/readium/navigators/web/scripts/public/prepaginated-double-index.html b/readium/navigators/web/scripts/public/prepaginated-double-index.html index b97f7653fb..d6041ae251 100644 --- a/readium/navigators/web/scripts/public/prepaginated-double-index.html +++ b/readium/navigators/web/scripts/public/prepaginated-double-index.html @@ -12,7 +12,7 @@ body, html { height: 100%; width: 100%; - background: transparent; + background-color: transparent; } .viewport { @@ -24,7 +24,7 @@ width: 0px; height: 0px; border: none; - background: white; + background-color: white; } diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-index.html b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-index.html index b97f7653fb..d6041ae251 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-index.html +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-index.html @@ -12,7 +12,7 @@ body, html { height: 100%; width: 100%; - background: transparent; + background-color: transparent; } .viewport { @@ -24,7 +24,7 @@ width: 0px; height: 0px; border: none; - background: white; + background-color: white; } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt index fba0d6edab..dc50607422 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt @@ -4,11 +4,13 @@ import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.displayCutout import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Size +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.unit.LayoutDirection @@ -31,6 +33,7 @@ import org.readium.r2.shared.ExperimentalReadiumApi public fun FixedWebNavigator( modifier: Modifier = Modifier, displayCutout: WindowInsets = WindowInsets.displayCutout, + backgroundColor: Color = MaterialTheme.colorScheme.background, onTap: (TapEvent) -> Unit = {}, state: FixedWebNavigatorState ) { @@ -75,7 +78,8 @@ public fun FixedWebNavigator( SingleViewportSpread( onTap = onTap, - state = spreadState + state = spreadState, + backgroundColor = backgroundColor ) } is DoubleViewportSpread -> { @@ -92,7 +96,8 @@ public fun FixedWebNavigator( DoubleViewportSpread( onTap = onTap, - state = spreadState + state = spreadState, + backgroundColor = backgroundColor ) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt index 0b0224c952..18130f6dd2 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt @@ -10,6 +10,7 @@ import androidx.compose.runtime.State import androidx.compose.runtime.remember import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.readium.navigator.web.layout.DoubleViewportSpread @@ -26,7 +27,8 @@ import org.readium.r2.shared.util.AbsoluteUrl @Composable internal fun DoubleViewportSpread( onTap: (TapEvent) -> Unit, - state: DoubleSpreadState + state: DoubleSpreadState, + backgroundColor: Color ) { Box( modifier = Modifier.fillMaxSize(), @@ -66,7 +68,8 @@ internal fun DoubleViewportSpread( SpreadWebView( state = webViewState, client = state.webViewClient, - onTap = onTap + onTap = onTap, + backgroundColor = backgroundColor ) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt index ff2e63f532..ce9660d010 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt @@ -10,6 +10,7 @@ import androidx.compose.runtime.State import androidx.compose.runtime.remember import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.readium.navigator.web.layout.SingleViewportSpread @@ -26,7 +27,8 @@ import org.readium.r2.shared.util.AbsoluteUrl @Composable internal fun SingleViewportSpread( onTap: (TapEvent) -> Unit, - state: SingleSpreadState + state: SingleSpreadState, + backgroundColor: Color ) { Box( modifier = Modifier.fillMaxSize(), @@ -66,7 +68,8 @@ internal fun SingleViewportSpread( SpreadWebView( state = webViewState, client = state.webViewClient, - onTap = onTap + onTap = onTap, + backgroundColor = backgroundColor ) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt index b95269f438..967cdbf202 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt @@ -7,6 +7,8 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalDensity import org.readium.navigator.web.util.WebViewClient @@ -22,7 +24,8 @@ import org.readium.r2.navigator.input.TapEvent internal fun SpreadWebView( state: WebViewState, client: WebViewClient, - onTap: (TapEvent) -> Unit + onTap: (TapEvent) -> Unit, + backgroundColor: Color ) { val scrollableState = remember { WebViewScrollable2DState() } @@ -58,6 +61,7 @@ internal fun SpreadWebView( webview.settings.useWideViewPort = true webview.isVerticalScrollBarEnabled = false webview.isHorizontalScrollBarEnabled = false + webview.setBackgroundColor(backgroundColor.toArgb()) } ) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt index 9f6471ce62..e5e674092d 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt @@ -172,7 +172,9 @@ internal fun WebView( ) } } - wv.onContentReady { state.loadingState = LoadingState.Finished } + wv.onContentReady { + state.loadingState = LoadingState.Finished + } } } } From a8fb2128586ea0b3bcc227214beb355f81fffe4b Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Thu, 26 Sep 2024 09:35:13 +0200 Subject: [PATCH 41/61] Fix preference filters --- .../web/preferences/FixedWebPreferencesFilters.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebPreferencesFilters.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebPreferencesFilters.kt index 89c693659f..c867892649 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebPreferencesFilters.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/preferences/FixedWebPreferencesFilters.kt @@ -17,7 +17,9 @@ public object FixedWebSharedPreferencesFilter : PreferencesFilter Date: Tue, 1 Oct 2024 12:28:29 +0200 Subject: [PATCH 42/61] Add go --- .../navigator/web/FixedWebNavigatorState.kt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt index d9f5f9e56f..592c47a0c2 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt @@ -1,5 +1,7 @@ package org.readium.navigator.web +import androidx.compose.animation.core.AnimationSpec +import androidx.compose.animation.core.spring import androidx.compose.foundation.pager.PagerState import androidx.compose.runtime.MutableState import androidx.compose.runtime.Stable @@ -23,7 +25,7 @@ import org.readium.r2.shared.publication.Metadata @Stable public class FixedWebNavigatorState internal constructor( publicationMetadata: Metadata, - readingOrder: ReadingOrder, + private val readingOrder: ReadingOrder, initialPreferences: FixedWebPreferences, defaults: FixedWebDefaults, initialItem: Int, @@ -69,4 +71,16 @@ public class FixedWebNavigatorState internal constructor( public val currentItem: State = derivedStateOf { layout.value.pageIndexForSpread(pagerState.currentPage) } + + public suspend fun goTo(item: Int): Unit = + pagerState.scrollToPage(layout.value.spreadIndexForPage(item)) + + public suspend fun animateGoTo( + item: Int, + animationSpec: AnimationSpec = spring() + ): Unit = + pagerState.animateScrollToPage( + layout.value.spreadIndexForPage(item), + animationSpec = animationSpec + ) } From b39036dc32e47e61baf903e0a4ab8b35d8855eaf Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Mon, 14 Oct 2024 13:04:02 +0200 Subject: [PATCH 43/61] Add composable pdf navigator and refactor demo --- gradle/libs.versions.toml | 5 +- readium/navigators/common/build.gradle.kts | 31 ++++ readium/navigators/common/gradle.properties | 1 + .../common/src/main/AndroidManifest.xml | 2 + .../readium/navigator/common/Configurable.kt | 19 +++ .../navigator/common/NavigatorState.kt | 3 + readium/navigators/demo/build.gradle.kts | 15 +- .../readium/navigator/demo/DemoActivity.kt | 74 ++++++--- .../readium/navigator/demo/DemoViewModel.kt | 91 ++-------- .../demo/preferences/PreferenceViews.kt | 70 ++++++++ .../demo/preferences/PreferencesManager.kt | 2 +- .../demo/preferences/UserPreferences.kt | 101 ++++++++--- .../preferences/UserPreferencesViewModel.kt | 5 +- .../demo/{DemoReader.kt => reader/Reader.kt} | 51 +++++- .../navigator/demo/reader/ReaderOpener.kt | 157 ++++++++++++++++++ .../navigator/demo/util/Fullscreenable.kt | 6 + .../org/readium/navigator/demo/util/Theme.kt | 6 + readium/navigators/pdf/build.gradle.kts | 34 ++++ readium/navigators/pdf/gradle.properties | 1 + .../pdf/src/main/AndroidManifest.xml | 2 + .../org/readium/navigator/pdf/PdfNavigator.kt | 155 +++++++++++++++++ .../navigator/pdf/PdfNavigatorFactory.kt | 57 +++++++ .../navigator/pdf/PdfNavigatorState.kt | 33 ++++ readium/navigators/web/build.gradle.kts | 1 + .../navigator/web/FixedWebNavigatorState.kt | 10 +- settings.gradle.kts | 8 + 26 files changed, 792 insertions(+), 148 deletions(-) create mode 100644 readium/navigators/common/build.gradle.kts create mode 100644 readium/navigators/common/gradle.properties create mode 100644 readium/navigators/common/src/main/AndroidManifest.xml create mode 100644 readium/navigators/common/src/main/java/org/readium/navigator/common/Configurable.kt create mode 100644 readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt rename readium/navigators/demo/src/main/java/org/readium/navigator/demo/{DemoReader.kt => reader/Reader.kt} (64%) create mode 100644 readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt create mode 100644 readium/navigators/pdf/build.gradle.kts create mode 100644 readium/navigators/pdf/gradle.properties create mode 100644 readium/navigators/pdf/src/main/AndroidManifest.xml create mode 100644 readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigator.kt create mode 100644 readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt create mode 100644 readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9d6c04f460..715917ead8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,7 +23,7 @@ androidx-core = "1.13.1" androidx-datastore = "1.1.1" androidx-expresso-core = "3.5.1" androidx-ext-junit = "1.1.5" -androidx-fragment-ktx = "1.7.1" +androidx-fragment = "1.8.4" androidx-legacy = "1.0.0" androidx-lifecycle = "2.8.0" androidx-lifecycle-extensions = "2.2.0" @@ -93,7 +93,8 @@ androidx-core = { group = "androidx.core", name = "core-ktx", version.ref = "and androidx-datastore-preferences = { group = "androidx.datastore", name = "datastore-preferences", version.ref = "androidx-datastore" } androidx-expresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "androidx-expresso-core" } androidx-ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-ext-junit" } -androidx-fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "androidx-fragment-ktx" } +androidx-fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "androidx-fragment" } +androidx-fragment-compose = { group = "androidx.fragment", name = "fragment-compose", version.ref = "androidx-fragment" } androidx-legacy-v4 = { group = "androidx.legacy", name = "legacy-support-v4", version.ref = "androidx-legacy" } androidx-legacy-ui = { group = "androidx.legacy", name = "legacy-support-core-ui", version.ref = "androidx-legacy" } androidx-lifecycle-common = { group = "androidx.lifecycle", name = "lifecycle-common-java8", version.ref = "androidx-lifecycle" } diff --git a/readium/navigators/common/build.gradle.kts b/readium/navigators/common/build.gradle.kts new file mode 100644 index 0000000000..723865ffac --- /dev/null +++ b/readium/navigators/common/build.gradle.kts @@ -0,0 +1,31 @@ +/* + * Copyright 2022 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +plugins { + id("readium.library-conventions") + alias(libs.plugins.kotlin.serialization) +} + +android { + namespace = "org.readium.navigators.common" + + composeOptions { + kotlinCompilerExtensionVersion = libs.versions.androidx.compose.compiler.get() + } + buildFeatures { + compose = true + } +} + +dependencies { + api(project(":readium:readium-shared")) + api(project(":readium:readium-navigator")) + + implementation(libs.kotlinx.serialization.json) + implementation(libs.bundles.compose) + implementation(libs.timber) + implementation(libs.kotlinx.coroutines.android) +} diff --git a/readium/navigators/common/gradle.properties b/readium/navigators/common/gradle.properties new file mode 100644 index 0000000000..0b100abff5 --- /dev/null +++ b/readium/navigators/common/gradle.properties @@ -0,0 +1 @@ +pom.artifactId=readium-navigator-common diff --git a/readium/navigators/common/src/main/AndroidManifest.xml b/readium/navigators/common/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..8072ee00db --- /dev/null +++ b/readium/navigators/common/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/Configurable.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/Configurable.kt new file mode 100644 index 0000000000..369a8f2251 --- /dev/null +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/Configurable.kt @@ -0,0 +1,19 @@ +package org.readium.navigator.common + +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.State +import org.readium.r2.shared.ExperimentalReadiumApi + +@ExperimentalReadiumApi +public interface Configurable { + + public val preferences: MutableState

      + + public val settings: State +} + +@ExperimentalReadiumApi +public typealias Settings = org.readium.r2.navigator.preferences.Configurable.Settings + +@ExperimentalReadiumApi +public typealias Preferences

      = org.readium.r2.navigator.preferences.Configurable.Preferences

      diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt new file mode 100644 index 0000000000..037e5ebe8e --- /dev/null +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt @@ -0,0 +1,3 @@ +package org.readium.navigator.common + +public interface NavigatorState diff --git a/readium/navigators/demo/build.gradle.kts b/readium/navigators/demo/build.gradle.kts index 19f322acba..1f2d5699cc 100644 --- a/readium/navigators/demo/build.gradle.kts +++ b/readium/navigators/demo/build.gradle.kts @@ -59,9 +59,12 @@ android { } dependencies { - api(project(":readium:navigators:readium-navigator-web")) - api(project(":readium:readium-shared")) - api(project(":readium:readium-streamer")) + implementation(project(":readium:readium-shared")) + implementation(project(":readium:readium-streamer")) + implementation(project(":readium:readium-navigator")) + implementation(project(":readium:navigators:readium-navigator-web")) + implementation(project(":readium:navigators:readium-navigator-pdf")) + implementation(project(":readium:adapters:pdfium")) coreLibraryDesugaring(libs.desugar.jdk.libs) @@ -71,9 +74,7 @@ dependencies { implementation(libs.androidx.legacy.v4) implementation(libs.bundles.compose) implementation(libs.androidx.core) + implementation(libs.androidx.fragment.ktx) + implementation(libs.androidx.fragment.compose) implementation(libs.androidx.appcompat) - - testImplementation(libs.junit) - androidTestImplementation(libs.androidx.ext.junit) - androidTestImplementation(libs.androidx.expresso.core) } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt index ecc471fa2a..276f5c5c89 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt @@ -8,12 +8,16 @@ package org.readium.navigator.demo import android.net.Uri import android.os.Bundle -import androidx.activity.ComponentActivity +import androidx.activity.compose.BackHandler import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.safeDrawingPadding +import androidx.compose.material3.SnackbarDuration +import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Surface import androidx.compose.runtime.Composable @@ -21,13 +25,16 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.core.view.WindowCompat +import androidx.fragment.app.FragmentActivity +import org.readium.navigator.demo.reader.Reader import org.readium.navigator.demo.util.Fullscreenable import org.readium.navigator.demo.util.Theme import org.readium.r2.shared.util.toAbsoluteUrl -class DemoActivity : ComponentActivity() { +class DemoActivity : FragmentActivity() { private val viewModel: DemoViewModel by viewModels() @@ -35,14 +42,13 @@ class DemoActivity : ComponentActivity() { registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri: Uri? -> uri?.let { val url = requireNotNull(it.toAbsoluteUrl()) - viewModel.open(url) + viewModel.onBookSelected(url) } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() - setContent { Theme { val fullscreenState = remember { mutableStateOf(false) } @@ -63,33 +69,51 @@ class DemoActivity : ComponentActivity() { } } - when (val stateNow = state.value) { - DemoViewModel.State.BookSelection -> { - Placeholder() - LaunchedEffect(stateNow) { - sharedStoragePickerLauncher.launch(arrayOf("*/*")) + Box( + modifier = Modifier.fillMaxSize() + ) { + when (val stateNow = state.value) { + DemoViewModel.State.BookSelection -> { + Placeholder() + LaunchedEffect(stateNow) { + sharedStoragePickerLauncher.launch(arrayOf("*/*")) + } } - } - is DemoViewModel.State.Error -> { - Placeholder() - LaunchedEffect(stateNow.error) { - snackbarHostState.showSnackbar(stateNow.error.message) - viewModel.acknowledgeError() + is DemoViewModel.State.Error -> { + Placeholder() + LaunchedEffect(stateNow.error) { + snackbarHostState.showSnackbar( + message = stateNow.error.message, + duration = SnackbarDuration.Short + ) + viewModel.onErrorDisplayed() + } } - } - DemoViewModel.State.Loading -> { - Placeholder() - // Display and do nothing - } + DemoViewModel.State.Loading -> { + Placeholder() + // Display and do nothing + } + + is DemoViewModel.State.Reader -> { + BackHandler { + viewModel.onBookClosed() + } - is DemoViewModel.State.Reader -> { - Reader( - state = stateNow, - fullScreenState = fullscreenState - ) + Reader( + state = stateNow.readerState, + fullScreenState = fullscreenState + ) + } } + + SnackbarHost( + modifier = Modifier + .align(Alignment.BottomCenter) + .safeDrawingPadding(), + hostState = snackbarHostState + ) } } } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt index c40fd35553..08a19402c9 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt @@ -4,8 +4,6 @@ * available in the top-level LICENSE file of the project. */ -@file:OptIn(ExperimentalReadiumApi::class) - package org.readium.navigator.demo import android.app.Application @@ -14,22 +12,10 @@ import androidx.lifecycle.viewModelScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch -import org.readium.navigator.demo.preferences.PreferencesManager -import org.readium.navigator.demo.preferences.UserPreferencesViewModel -import org.readium.navigator.web.FixedWebNavigatorFactory -import org.readium.navigator.web.FixedWebNavigatorState -import org.readium.navigator.web.preferences.FixedWebPreferences -import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.navigator.demo.reader.ReaderOpener +import org.readium.navigator.demo.reader.ReaderState import org.readium.r2.shared.util.AbsoluteUrl -import org.readium.r2.shared.util.DebugError -import org.readium.r2.shared.util.asset.AssetRetriever -import org.readium.r2.shared.util.getOrElse -import org.readium.r2.shared.util.http.DefaultHttpClient -import org.readium.r2.streamer.PublicationOpener -import org.readium.r2.streamer.parser.DefaultPublicationParser import timber.log.Timber class DemoViewModel( @@ -49,8 +35,7 @@ class DemoViewModel( ) : State data class Reader( - val navigatorState: FixedWebNavigatorState, - val preferencesViewModel: UserPreferencesViewModel + val readerState: ReaderState ) : State } @@ -58,74 +43,32 @@ class DemoViewModel( Timber.plant(Timber.DebugTree()) } - private val httpClient = - DefaultHttpClient() - - private val assetRetriever = - AssetRetriever(application.contentResolver, httpClient) - - private val publicationParser = - DefaultPublicationParser(application, httpClient, assetRetriever, null) - - private val publicationOpener = - PublicationOpener(publicationParser) + private val readerOpener = + ReaderOpener(application) private val stateMutable: MutableStateFlow = MutableStateFlow(State.BookSelection) val state: StateFlow = stateMutable.asStateFlow() - fun open(url: AbsoluteUrl) { + fun onBookSelected(url: AbsoluteUrl) { stateMutable.value = State.Loading viewModelScope.launch { - val asset = assetRetriever.retrieve(url) - .getOrElse { - stateMutable.value = State.Error(it) - return@launch - } - - val publication = publicationOpener.open(asset, allowUserInteraction = false) - .getOrElse { - asset.close() - stateMutable.value = State.Error(it) - return@launch - } - - val navigatorFactory = FixedWebNavigatorFactory(getApplication(), publication) - ?: run { - publication.close() - val error = DebugError("Publication not supported") - stateMutable.value = State.Error(error) - return@launch - } - - val initialPreferences = FixedWebPreferences() - - val preferencesViewModel = - UserPreferencesViewModel( - viewModelScope = viewModelScope, - preferencesManager = PreferencesManager(initialPreferences), - createPreferencesEditor = navigatorFactory::createPreferencesEditor - ) - - val navigatorState = navigatorFactory.createNavigator( - initialPreferences = initialPreferences - ).getOrElse { - throw IllegalStateException() - } - - preferencesViewModel.preferences - .onEach { - navigatorState.preferences.value = it - } - .launchIn(viewModelScope) - - stateMutable.value = State.Reader(navigatorState, preferencesViewModel) + readerOpener.open(url) + .onFailure { stateMutable.value = State.Error(it) } + .onSuccess { stateMutable.value = State.Reader(it) } } } - fun acknowledgeError() { + fun onBookClosed() { + val stateNow = state.value + check(stateNow is State.Reader) + stateMutable.value = State.BookSelection + stateNow.readerState.close() + } + + fun onErrorDisplayed() { stateMutable.value = State.BookSelection } } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/PreferenceViews.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/PreferenceViews.kt index 48e40b9d28..37d0cf25ec 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/PreferenceViews.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/PreferenceViews.kt @@ -9,9 +9,13 @@ package org.readium.navigator.demo.preferences import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.widthIn import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.Backspace +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Remove import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.ListItem @@ -19,11 +23,15 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp import org.readium.navigator.demo.util.Group import org.readium.navigator.demo.util.ToggleButtonGroup import org.readium.r2.navigator.preferences.EnumPreference import org.readium.r2.navigator.preferences.Preference +import org.readium.r2.navigator.preferences.RangePreference import org.readium.r2.navigator.preferences.clear import org.readium.r2.navigator.preferences.toggle import org.readium.r2.shared.ExperimentalReadiumApi @@ -88,6 +96,68 @@ private fun ButtonGroupItem( } } +/** + * Component for a [RangePreference] with decrement and increment buttons. + */ +@Composable +fun > StepperItem( + title: String, + preference: RangePreference, + commit: () -> Unit +) { + StepperItem( + title = title, + isActive = preference.isEffective, + value = preference.value ?: preference.effectiveValue, + formatValue = preference::formatValue, + onDecrement = { preference.decrement(); commit() }, + onIncrement = { preference.increment(); commit() }, + onClear = { preference.clear(); commit() } + .takeIf { preference.value != null } + ) +} + +/** + * Component for a [RangePreference] with decrement and increment buttons. + */ +@Composable +private fun StepperItem( + title: String, + isActive: Boolean, + value: T, + formatValue: (T) -> String, + onDecrement: () -> Unit, + onIncrement: () -> Unit, + onClear: (() -> Unit)? +) { + Item(title, isActive = isActive, onClear = onClear) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(16.dp) + ) { + IconButton( + onClick = onDecrement, + content = { + Icon(Icons.Default.Remove, contentDescription = "Less") + } + ) + + Text( + text = formatValue(value), + modifier = Modifier.widthIn(min = 30.dp), + textAlign = TextAlign.Center + ) + + IconButton( + onClick = onIncrement, + content = { + Icon(Icons.Default.Add, contentDescription = "More") + } + ) + } + } +} + /** * Component for a boolean [Preference]. */ diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/PreferencesManager.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/PreferencesManager.kt index 68b764c39c..ba6d43ef32 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/PreferencesManager.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/PreferencesManager.kt @@ -15,7 +15,7 @@ import org.readium.r2.navigator.preferences.Configurable import org.readium.r2.shared.ExperimentalReadiumApi /** - * Trivial user preferences manager without persistence. + * Trivial user preferences manager. You can add persistence. */ class PreferencesManager

      >( initialPreferences: P diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferences.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferences.kt index 5111ed0fbd..28a0880474 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferences.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferences.kt @@ -26,12 +26,15 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import org.readium.adapter.pdfium.navigator.PdfiumPreferencesEditor import org.readium.navigator.web.preferences.FixedWebPreferencesEditor +import org.readium.r2.navigator.preferences.Axis import org.readium.r2.navigator.preferences.Configurable import org.readium.r2.navigator.preferences.EnumPreference import org.readium.r2.navigator.preferences.Fit import org.readium.r2.navigator.preferences.Preference import org.readium.r2.navigator.preferences.PreferencesEditor +import org.readium.r2.navigator.preferences.RangePreference import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi @@ -40,7 +43,7 @@ import org.readium.r2.shared.ExperimentalReadiumApi */ @Composable fun UserPreferences( - model: UserPreferencesViewModel<*>, + model: UserPreferencesViewModel<*, *>, title: String ) { val editor by model.editor.collectAsState() @@ -97,6 +100,14 @@ private fun

      , E : PreferencesEditor

      > UserPref fit = editor.fit, spreads = editor.spreads ) + is PdfiumPreferencesEditor -> + FixedLayoutUserPreferences( + commit = commit, + readingProgression = editor.readingProgression, + scrollAxis = editor.scrollAxis, + fit = editor.fit, + pageSpacing = editor.pageSpacing + ) } } } @@ -107,37 +118,75 @@ private fun

      , E : PreferencesEditor

      > UserPref @Composable private fun FixedLayoutUserPreferences( commit: () -> Unit, - readingProgression: EnumPreference, - fit: EnumPreference, - spreads: Preference + readingProgression: EnumPreference? = null, + scrollAxis: EnumPreference? = null, + fit: EnumPreference? = null, + spreads: Preference? = null, + offsetFirstPage: Preference? = null, + pageSpacing: RangePreference? = null ) { - ButtonGroupItem( - title = "Reading progression", - preference = readingProgression, - commit = commit, - formatValue = { it.name } - ) + if (readingProgression != null) { + ButtonGroupItem( + title = "Reading progression", + preference = readingProgression, + commit = commit, + formatValue = { it.name } + ) - Divider() + Divider() + } - SwitchItem( - title = "Spreads", - preference = spreads, - commit = commit - ) + if (scrollAxis != null) { + ButtonGroupItem( + title = "Scroll axis", + preference = scrollAxis, + commit = commit + ) { value -> + when (value) { + Axis.HORIZONTAL -> "Horizontal" + Axis.VERTICAL -> "Vertical" + } + } + } + + if (spreads != null) { + SwitchItem( + title = "Spreads", + preference = spreads, + commit = commit + ) - ButtonGroupItem( - title = "Fit", - preference = fit, - commit = commit - ) { value -> - when (value) { - Fit.CONTAIN -> "Contain" - Fit.COVER -> "Cover" - Fit.WIDTH -> "Width" - Fit.HEIGHT -> "Height" + if (offsetFirstPage != null) { + SwitchItem( + title = "Offset", + preference = offsetFirstPage, + commit = commit + ) } } + + if (fit != null) { + ButtonGroupItem( + title = "Fit", + preference = fit, + commit = commit + ) { value -> + when (value) { + Fit.CONTAIN -> "Contain" + Fit.COVER -> "Cover" + Fit.WIDTH -> "Width" + Fit.HEIGHT -> "Height" + } + } + } + + if (pageSpacing != null) { + StepperItem( + title = "Page spacing", + preference = pageSpacing, + commit = commit + ) + } } @Composable diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferencesViewModel.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferencesViewModel.kt index d14cc26c9f..ae695730bb 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferencesViewModel.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/preferences/UserPreferencesViewModel.kt @@ -9,14 +9,15 @@ package org.readium.navigator.demo.preferences import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch -import org.readium.r2.navigator.preferences.Configurable +import org.readium.navigator.common.Preferences +import org.readium.navigator.common.Settings import org.readium.r2.navigator.preferences.PreferencesEditor import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.InternalReadiumApi import org.readium.r2.shared.extensions.mapStateIn @OptIn(ExperimentalReadiumApi::class, InternalReadiumApi::class) -class UserPreferencesViewModel

      >( +class UserPreferencesViewModel>( private val viewModelScope: CoroutineScope, private val preferencesManager: PreferencesManager

      , createPreferencesEditor: (P) -> PreferencesEditor

      diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoReader.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt similarity index 64% rename from readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoReader.kt rename to readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt index 5ae2c8e5ea..5e39a2006f 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoReader.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt @@ -4,7 +4,7 @@ * available in the top-level LICENSE file of the project. */ -package org.readium.navigator.demo +package org.readium.navigator.demo.reader import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn @@ -25,14 +25,36 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.zIndex +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.cancel +import org.readium.navigator.common.NavigatorState import org.readium.navigator.demo.preferences.UserPreferences +import org.readium.navigator.demo.preferences.UserPreferencesViewModel +import org.readium.navigator.pdf.PdfNavigator +import org.readium.navigator.pdf.PdfNavigatorState import org.readium.navigator.web.FixedWebNavigator +import org.readium.navigator.web.FixedWebNavigatorState +import org.readium.r2.navigator.input.TapEvent import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.Publication + +data class ReaderState( + val coroutineScope: CoroutineScope, + val publication: Publication, + val navigatorState: NavigatorState, + val preferencesViewModel: UserPreferencesViewModel<*, *> +) { + + fun close() { + coroutineScope.cancel() + publication.close() + } +} @OptIn(ExperimentalMaterial3Api::class, ExperimentalReadiumApi::class) @Composable fun Reader( - state: DemoViewModel.State.Reader, + state: ReaderState, fullScreenState: MutableState ) { val showPreferences = remember { mutableStateOf(false) } @@ -57,11 +79,26 @@ fun Reader( onPreferencesActivated = { showPreferences.value = !showPreferences.value } ) - FixedWebNavigator( - modifier = Modifier.fillMaxSize(), - state = state.navigatorState, - onTap = { fullScreenState.value = !fullScreenState.value; true } - ) + val onTap = remember(fullScreenState) { + { _: TapEvent -> fullScreenState.value = !fullScreenState.value } + } + + when (state.navigatorState) { + is FixedWebNavigatorState -> { + FixedWebNavigator( + modifier = Modifier.fillMaxSize(), + state = state.navigatorState, + onTap = onTap + ) + } + is PdfNavigatorState<*, *> -> { + PdfNavigator( + modifier = Modifier.fillMaxSize(), + state = state.navigatorState, + onTap = onTap + ) + } + } } } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt new file mode 100644 index 0000000000..60c3a00e82 --- /dev/null +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt @@ -0,0 +1,157 @@ +/* + * Copyright 2024 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +@file:OptIn(ExperimentalReadiumApi::class) + +package org.readium.navigator.demo.reader + +import android.app.Application +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import org.readium.adapter.pdfium.document.PdfiumDocumentFactory +import org.readium.adapter.pdfium.navigator.PdfiumEngineProvider +import org.readium.adapter.pdfium.navigator.PdfiumPreferences +import org.readium.adapter.pdfium.navigator.PdfiumSettings +import org.readium.navigator.demo.preferences.PreferencesManager +import org.readium.navigator.demo.preferences.UserPreferencesViewModel +import org.readium.navigator.pdf.PdfNavigatorFactory +import org.readium.navigator.web.FixedWebNavigatorFactory +import org.readium.navigator.web.preferences.FixedWebPreferences +import org.readium.navigator.web.preferences.FixedWebSettings +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.Publication +import org.readium.r2.shared.util.AbsoluteUrl +import org.readium.r2.shared.util.DebugError +import org.readium.r2.shared.util.Error +import org.readium.r2.shared.util.Try +import org.readium.r2.shared.util.asset.AssetRetriever +import org.readium.r2.shared.util.getOrElse +import org.readium.r2.shared.util.http.DefaultHttpClient +import org.readium.r2.streamer.PublicationOpener +import org.readium.r2.streamer.parser.DefaultPublicationParser + +class ReaderOpener( + private val application: Application +) { + + private val httpClient = + DefaultHttpClient() + + private val assetRetriever = + AssetRetriever(application.contentResolver, httpClient) + + private val pdfiumDocumentFactory = + PdfiumDocumentFactory(application) + + private val publicationParser = + DefaultPublicationParser(application, httpClient, assetRetriever, pdfiumDocumentFactory) + + private val publicationOpener = + PublicationOpener(publicationParser) + + private val pdfEngineProvider = + PdfiumEngineProvider() + + suspend fun open(url: AbsoluteUrl): Try { + val asset = assetRetriever.retrieve(url) + .getOrElse { return Try.failure(it) } + + val publication = publicationOpener.open(asset, allowUserInteraction = false) + .getOrElse { + asset.close() + return Try.failure(it) + } + + val readerState = when { + publication.conformsTo(Publication.Profile.EPUB) -> + createFixedWebReader(publication) + publication.conformsTo(Publication.Profile.PDF) -> + createPdfReader(publication) + else -> + Try.failure(DebugError("Publication not supported")) + }.getOrElse { error -> + publication.close() + return Try.failure(error) + } + + return Try.success(readerState) + } + + private suspend fun createFixedWebReader( + publication: Publication + ): Try { + val navigatorFactory = FixedWebNavigatorFactory(application, publication) + ?: return Try.failure(DebugError("Publication not supported")) + + val initialPreferences = FixedWebPreferences() + + val navigatorState = navigatorFactory.createNavigator( + initialPreferences = initialPreferences + ).getOrElse { + return Try.failure(it) + } + + val coroutineScope = MainScope() + + val preferencesViewModel = + UserPreferencesViewModel( + viewModelScope = coroutineScope, + preferencesManager = PreferencesManager(initialPreferences), + createPreferencesEditor = navigatorFactory::createPreferencesEditor + ) + + preferencesViewModel.preferences + .onEach { + navigatorState.preferences.value = it + }.launchIn(coroutineScope) + + val readerState = ReaderState( + coroutineScope = coroutineScope, + publication = publication, + navigatorState = navigatorState, + preferencesViewModel = preferencesViewModel + ) + + return Try.success(readerState) + } + + private fun createPdfReader( + publication: Publication + ): Try { + val navigatorFactory = PdfNavigatorFactory(publication, pdfEngineProvider) + + val initialPreferences = PdfiumPreferences() + + val navigatorState = navigatorFactory.createNavigator( + initialPreferences = initialPreferences + ).getOrElse { + throw IllegalStateException() + } + + val coroutineScope = MainScope() + + val preferencesViewModel = + UserPreferencesViewModel( + viewModelScope = coroutineScope, + preferencesManager = PreferencesManager(initialPreferences), + createPreferencesEditor = navigatorFactory::createPreferencesEditor + ) + + preferencesViewModel.preferences + .onEach { navigatorState.preferences.value = it } + .launchIn(coroutineScope) + + val readerState = ReaderState( + coroutineScope = coroutineScope, + publication = publication, + navigatorState = navigatorState, + preferencesViewModel = preferencesViewModel + ) + + return Try.success(readerState) + } +} diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Fullscreenable.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Fullscreenable.kt index 9c62858f22..49a027a5f8 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Fullscreenable.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Fullscreenable.kt @@ -1,3 +1,9 @@ +/* + * Copyright 2024 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + package org.readium.navigator.demo.util import androidx.compose.runtime.Composable diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Theme.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Theme.kt index 5e40b53c6f..0965f29764 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Theme.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/Theme.kt @@ -1,3 +1,9 @@ +/* + * Copyright 2024 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + package org.readium.navigator.demo.util import androidx.compose.foundation.isSystemInDarkTheme diff --git a/readium/navigators/pdf/build.gradle.kts b/readium/navigators/pdf/build.gradle.kts new file mode 100644 index 0000000000..2b2698d313 --- /dev/null +++ b/readium/navigators/pdf/build.gradle.kts @@ -0,0 +1,34 @@ +/* + * Copyright 2022 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +plugins { + id("readium.library-conventions") + alias(libs.plugins.kotlin.serialization) +} + +android { + namespace = "org.readium.navigators.pdf" + + composeOptions { + kotlinCompilerExtensionVersion = libs.versions.androidx.compose.compiler.get() + } + buildFeatures { + compose = true + } +} + +dependencies { + api(project(":readium:readium-shared")) + api(project(":readium:readium-navigator")) + api(project(":readium:navigators:readium-navigator-common")) + + implementation(libs.androidx.fragment.ktx) + implementation(libs.androidx.fragment.compose) + implementation(libs.kotlinx.serialization.json) + implementation(libs.bundles.compose) + implementation(libs.timber) + implementation(libs.kotlinx.coroutines.android) +} diff --git a/readium/navigators/pdf/gradle.properties b/readium/navigators/pdf/gradle.properties new file mode 100644 index 0000000000..952f725727 --- /dev/null +++ b/readium/navigators/pdf/gradle.properties @@ -0,0 +1 @@ +pom.artifactId=readium-navigator-pdf diff --git a/readium/navigators/pdf/src/main/AndroidManifest.xml b/readium/navigators/pdf/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..8072ee00db --- /dev/null +++ b/readium/navigators/pdf/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigator.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigator.kt new file mode 100644 index 0000000000..48d8567487 --- /dev/null +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigator.kt @@ -0,0 +1,155 @@ +package org.readium.navigator.pdf + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import androidx.compose.runtime.Composable +import androidx.compose.runtime.snapshotFlow +import androidx.compose.ui.Modifier +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentContainerView +import androidx.fragment.app.FragmentFactory +import androidx.fragment.app.viewModels +import androidx.fragment.compose.AndroidFragment +import androidx.lifecycle.ViewModel +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import org.readium.navigator.common.Preferences +import org.readium.navigator.common.Settings +import org.readium.r2.navigator.input.InputListener +import org.readium.r2.navigator.input.TapEvent +import org.readium.r2.navigator.pdf.PdfNavigatorFactory +import org.readium.r2.navigator.pdf.PdfNavigatorFragment +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.Locator + +@ExperimentalReadiumApi +@Composable +public fun > PdfNavigator( + modifier: Modifier = Modifier, + state: PdfNavigatorState, + onTap: (TapEvent) -> Unit +) { + val preferencesFlow = snapshotFlow { state.preferences.value } + + AndroidFragment>( + modifier = modifier, + onUpdate = { + val onFragmentCreated: (PdfNavigatorFragment) -> Unit = { fragment -> + + val inputListener = + object : InputListener { + override fun onTap(event: TapEvent): Boolean { + onTap.invoke(event) + return true + } + } + fragment.addInputListener(inputListener) + + fragment.currentLocator + .onEach { locator -> + state.locator.value = locator + } + .launchIn(fragment.lifecycleScope) + + preferencesFlow + .onEach { preferences -> fragment.submitPreferences(preferences) } + .launchIn(fragment.lifecycleScope) + } + + it.setNavigatorFactory( + state.pdfNavigatorFactory, + state.locator.value, + state.preferences.value, + onFragmentCreated + ) + } + ) +} + +@OptIn(ExperimentalReadiumApi::class) +public // Visible for Android +class PdfFragment> : Fragment() { + + private val viewModel: PdfFragmentViewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?) { + childFragmentManager.fragmentFactory = viewModel.fragmentFactory + super.onCreate(savedInstanceState) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val fragmentContainer = FragmentContainerView(requireContext()) + fragmentContainer.layoutParams = + ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + fragmentContainer.id = viewModel.navigatorViewId + return fragmentContainer + } + + internal fun setNavigatorFactory( + navigatorFactory: PdfNavigatorFactory, + locator: Locator, + preferences: P, + onFragmentCreated: (fragment: PdfNavigatorFragment) -> Unit + ) { + viewModel.fragmentFactory.factory = + navigatorFactory.createFragmentFactory( + initialLocator = locator, + initialPreferences = preferences + ) + + childFragmentManager.beginTransaction() + .replace( + viewModel.navigatorViewId, + PdfNavigatorFragment::class.java, + Bundle(), + "PdfNavigator" + ) + .commitNow() + + @Suppress("Unchecked_cast") + val fragment = childFragmentManager.fragments[0] as PdfNavigatorFragment + onFragmentCreated(fragment) + } +} + +@ExperimentalReadiumApi +public class PdfFragmentViewModel : ViewModel() { + + internal val navigatorViewId: Int = View.generateViewId() + + internal val fragmentFactory = MutableFragmentFactory(CoolFragmentFactory()) +} + +private class CoolFragmentFactory : FragmentFactory() { + override fun instantiate(classLoader: ClassLoader, className: String): Fragment { + return object : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + return FrameLayout(requireContext()) + } + } + } +} + +public class MutableFragmentFactory(public var factory: FragmentFactory? = null) : FragmentFactory() { + override fun instantiate(classLoader: ClassLoader, className: String): Fragment = + when (val factoryNow = factory) { + null -> super.instantiate(classLoader, className) + else -> factoryNow.instantiate(classLoader, className) + } +} diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt new file mode 100644 index 0000000000..e4c28b30f4 --- /dev/null +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2022 Readium Foundation. All rights reserved. + * Use of this source code is governed by the BSD-style license + * available in the top-level LICENSE file of the project. + */ + +package org.readium.navigator.pdf + +import org.readium.navigator.common.Preferences +import org.readium.navigator.common.Settings +import org.readium.r2.navigator.pdf.PdfEngineProvider +import org.readium.r2.navigator.pdf.PdfNavigatorFactory +import org.readium.r2.navigator.preferences.PreferencesEditor +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.Locator +import org.readium.r2.shared.publication.Publication +import org.readium.r2.shared.util.Try + +@ExperimentalReadiumApi +public class PdfNavigatorFactory, E : PreferencesEditor

      >( + private val publication: Publication, + private val pdfEngineProvider: PdfEngineProvider +) { + + public fun createNavigator( + initialLocator: Locator? = null, + initialPreferences: P? = null + ): Try, Nothing> { + val actualInitialLocator = initialLocator + ?: publication.locatorFromLink(publication.readingOrder[0])!! + + val actualInitialPreferences = initialPreferences + ?: pdfEngineProvider.createEmptyPreferences() + + val legacyNavigatorFactory = + PdfNavigatorFactory(publication, pdfEngineProvider) + + val settingsResolver = { preferences: P -> + pdfEngineProvider.computeSettings(publication.metadata, preferences) + } + + val navigatorState = + PdfNavigatorState( + legacyNavigatorFactory, + settingsResolver, + actualInitialLocator, + actualInitialPreferences + ) + + return Try.success(navigatorState) + } + + public fun createPreferencesEditor( + currentPreferences: P + ): E = + pdfEngineProvider.createPreferenceEditor(publication, currentPreferences) +} diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt new file mode 100644 index 0000000000..baf14f01e4 --- /dev/null +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt @@ -0,0 +1,33 @@ +package org.readium.navigator.pdf + +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.Stable +import androidx.compose.runtime.State +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.mutableStateOf +import org.readium.navigator.common.Configurable +import org.readium.navigator.common.NavigatorState +import org.readium.navigator.common.Preferences +import org.readium.navigator.common.Settings +import org.readium.r2.navigator.pdf.PdfNavigatorFactory +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.Locator + +@ExperimentalReadiumApi +@Stable +public class PdfNavigatorState> internal constructor( + internal val pdfNavigatorFactory: PdfNavigatorFactory, + private val settingsResolver: (P) -> S, + initialLocator: Locator, + initialPreferences: P +) : NavigatorState, Configurable { + + override val preferences: MutableState

      = + mutableStateOf(initialPreferences) + + override val settings: State = + derivedStateOf { settingsResolver.invoke(preferences.value) } + + internal val locator: MutableState = + mutableStateOf(initialLocator) +} diff --git a/readium/navigators/web/build.gradle.kts b/readium/navigators/web/build.gradle.kts index f3d16a0aff..be938e68e3 100644 --- a/readium/navigators/web/build.gradle.kts +++ b/readium/navigators/web/build.gradle.kts @@ -23,6 +23,7 @@ android { dependencies { api(project(":readium:readium-shared")) api(project(":readium:readium-navigator")) + api(project(":readium:navigators:readium-navigator-common")) implementation(libs.kotlinx.serialization.json) implementation(libs.bundles.compose) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt index 592c47a0c2..ecb8f10dec 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt @@ -8,6 +8,8 @@ import androidx.compose.runtime.Stable import androidx.compose.runtime.State import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.mutableStateOf +import org.readium.navigator.common.Configurable +import org.readium.navigator.common.NavigatorState import org.readium.navigator.web.layout.Layout import org.readium.navigator.web.layout.LayoutResolver import org.readium.navigator.web.layout.ReadingOrder @@ -25,13 +27,13 @@ import org.readium.r2.shared.publication.Metadata @Stable public class FixedWebNavigatorState internal constructor( publicationMetadata: Metadata, - private val readingOrder: ReadingOrder, + readingOrder: ReadingOrder, initialPreferences: FixedWebPreferences, defaults: FixedWebDefaults, initialItem: Int, internal val webViewServer: WebViewServer, internal val preloadedData: PreloadedData -) { +) : NavigatorState, Configurable { init { require(initialItem < readingOrder.items.size) @@ -48,10 +50,10 @@ public class FixedWebNavigatorState internal constructor( private val layoutResolver = LayoutResolver(readingOrder) - public val preferences: MutableState = + public override val preferences: MutableState = mutableStateOf(initialPreferences) - public val settings: State = + public override val settings: State = derivedStateOf { settingsResolver.settings(preferences.value) } internal val webViewClient = diff --git a/settings.gradle.kts b/settings.gradle.kts index 6a9a934373..62ea973616 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -41,10 +41,18 @@ include(":readium:navigator") project(":readium:navigator") .name = "readium-navigator" +include(":readium:navigators:common") +project(":readium:navigators:common") + .name = "readium-navigator-common" + include(":readium:navigators:web") project(":readium:navigators:web") .name = "readium-navigator-web" +include(":readium:navigators:pdf") +project(":readium:navigators:pdf") + .name = "readium-navigator-pdf" + include(":readium:navigators:media:common") project(":readium:navigators:media:common") .name = "readium-navigator-media-common" From 15a88416b9615d3c46edf32ca513979beb881799 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Mon, 21 Oct 2024 10:03:59 +0200 Subject: [PATCH 44/61] Add gesture detection into resource wrappers --- .../fixed-double-index.html} | 2 +- .../web/scripts/dist/fixed-double-script.js | 2 + .../scripts/dist/fixed-double-script.js.map | 1 + .../scripts/dist/fixed-injectable-script.js | 2 + .../dist/fixed-injectable-script.js.map | 1 + .../fixed-single-index.html} | 2 +- .../web/scripts/dist/fixed-single-script.js | 2 + .../scripts/dist/fixed-single-script.js.map | 1 + .../dist/prepaginated-double-script.js | 2 - .../dist/prepaginated-double-script.js.map | 1 - .../dist/prepaginated-injectable-script.js | 2 - .../prepaginated-injectable-script.js.map | 1 - .../dist/prepaginated-single-script.js | 2 - .../dist/prepaginated-single-script.js.map | 1 - .../scripts/public/fixed-double-index.html | 48 ++++++ .../scripts/public/fixed-single-index.html | 39 +++++ .../scripts/src/bridge/fixed-double-bridge.ts | 55 +++++++ .../src/bridge/fixed-gestures-bridge.ts | 22 +++ .../scripts/src/bridge/fixed-single-bridge.ts | 48 ++++++ .../web/scripts/src/common/events.ts | 4 + .../web/scripts/src/common/gestures.ts | 24 +-- .../web/scripts/src/fixed/area-manager.ts | 7 + .../double-area-manager.ts | 23 ++- .../{prepaginated => fixed}/page-manager.ts | 23 ++- .../scripts/src/fixed/single-area-manager.ts | 144 ++++++++++++++++++ .../web/scripts/src/index-fixed-double.ts | 35 +++++ .../web/scripts/src/index-fixed-injectable.ts | 34 +++++ .../web/scripts/src/index-fixed-single.ts | 32 ++++ .../scripts/src/index-prepaginated-double.ts | 59 ------- .../src/index-prepaginated-injectable.ts | 32 ---- .../scripts/src/index-prepaginated-single.ts | 69 --------- .../src/prepaginated/single-area-manager.ts | 86 ----------- .../navigators/web/scripts/webpack.config.js | 6 +- .../navigators/web/fixed-double-index.html | 48 ++++++ .../navigators/web/fixed-double-script.js | 2 + .../navigators/web/fixed-double-script.js.map | 1 + .../navigators/web/fixed-injectable-script.js | 2 + .../web/fixed-injectable-script.js.map | 1 + .../navigators/web/fixed-single-index.html | 39 +++++ .../navigators/web/fixed-single-script.js | 2 + .../navigators/web/fixed-single-script.js.map | 1 + .../web/prepaginated-double-script.js | 2 - .../web/prepaginated-double-script.js.map | 1 - .../web/prepaginated-injectable-script.js | 2 - .../web/prepaginated-injectable-script.js.map | 1 - .../web/prepaginated-single-script.js | 2 - .../web/prepaginated-single-script.js.map | 1 - .../navigator/web/FixedWebNavigatorFactory.kt | 8 +- .../web/spread/DoubleViewportSpread.kt | 4 +- .../web/spread/SingleViewportSpread.kt | 4 +- ...aginatedDoubleApi.kt => FixedDoubleApi.kt} | 10 +- ...aginatedSingleApi.kt => FixedSingleApi.kt} | 10 +- .../navigator/web/webapi/GesturesApi.kt | 8 +- .../web/webview/ComposableWebView.kt | 3 + 54 files changed, 660 insertions(+), 304 deletions(-) rename readium/navigators/web/scripts/{public/prepaginated-double-index.html => dist/fixed-double-index.html} (89%) create mode 100644 readium/navigators/web/scripts/dist/fixed-double-script.js create mode 100644 readium/navigators/web/scripts/dist/fixed-double-script.js.map create mode 100644 readium/navigators/web/scripts/dist/fixed-injectable-script.js create mode 100644 readium/navigators/web/scripts/dist/fixed-injectable-script.js.map rename readium/navigators/web/scripts/{public/prepaginated-single-index.html => dist/fixed-single-index.html} (85%) create mode 100644 readium/navigators/web/scripts/dist/fixed-single-script.js create mode 100644 readium/navigators/web/scripts/dist/fixed-single-script.js.map delete mode 100644 readium/navigators/web/scripts/dist/prepaginated-double-script.js delete mode 100644 readium/navigators/web/scripts/dist/prepaginated-double-script.js.map delete mode 100644 readium/navigators/web/scripts/dist/prepaginated-injectable-script.js delete mode 100644 readium/navigators/web/scripts/dist/prepaginated-injectable-script.js.map delete mode 100644 readium/navigators/web/scripts/dist/prepaginated-single-script.js delete mode 100644 readium/navigators/web/scripts/dist/prepaginated-single-script.js.map create mode 100644 readium/navigators/web/scripts/public/fixed-double-index.html create mode 100644 readium/navigators/web/scripts/public/fixed-single-index.html create mode 100644 readium/navigators/web/scripts/src/bridge/fixed-double-bridge.ts create mode 100644 readium/navigators/web/scripts/src/bridge/fixed-gestures-bridge.ts create mode 100644 readium/navigators/web/scripts/src/bridge/fixed-single-bridge.ts create mode 100644 readium/navigators/web/scripts/src/common/events.ts create mode 100644 readium/navigators/web/scripts/src/fixed/area-manager.ts rename readium/navigators/web/scripts/src/{prepaginated => fixed}/double-area-manager.ts (80%) rename readium/navigators/web/scripts/src/{prepaginated => fixed}/page-manager.ts (80%) create mode 100644 readium/navigators/web/scripts/src/fixed/single-area-manager.ts create mode 100644 readium/navigators/web/scripts/src/index-fixed-double.ts create mode 100644 readium/navigators/web/scripts/src/index-fixed-injectable.ts create mode 100644 readium/navigators/web/scripts/src/index-fixed-single.ts delete mode 100644 readium/navigators/web/scripts/src/index-prepaginated-double.ts delete mode 100644 readium/navigators/web/scripts/src/index-prepaginated-injectable.ts delete mode 100644 readium/navigators/web/scripts/src/index-prepaginated-single.ts delete mode 100644 readium/navigators/web/scripts/src/prepaginated/single-area-manager.ts create mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-index.html create mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js create mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map create mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js create mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map create mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-index.html create mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js create mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map delete mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js delete mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map delete mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js delete mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js.map delete mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js delete mode 100644 readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map rename readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/{PrepaginatedDoubleApi.kt => FixedDoubleApi.kt} (84%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/{PrepaginatedSingleApi.kt => FixedSingleApi.kt} (82%) diff --git a/readium/navigators/web/scripts/public/prepaginated-double-index.html b/readium/navigators/web/scripts/dist/fixed-double-index.html similarity index 89% rename from readium/navigators/web/scripts/public/prepaginated-double-index.html rename to readium/navigators/web/scripts/dist/fixed-double-index.html index d6041ae251..cc3c0ad854 100644 --- a/readium/navigators/web/scripts/public/prepaginated-double-index.html +++ b/readium/navigators/web/scripts/dist/fixed-double-index.html @@ -43,6 +43,6 @@ - + diff --git a/readium/navigators/web/scripts/dist/fixed-double-script.js b/readium/navigators/web/scripts/dist/fixed-double-script.js new file mode 100644 index 0000000000..27bb8eb5ea --- /dev/null +++ b/readium/navigators/web/scripts/dist/fixed-double-script.js @@ -0,0 +1,2 @@ +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{console.log(`onmessage ${t}`),this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y&&this.listener.onTap({x:t.data.x,y:t.data.y})}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const h=parseFloat(i.get("width")),n=parseFloat(i.get("height"));return h&&n?{width:h,height:n}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){console.log(`Constructing Gesturesdetector for window ${t}`),this.window=t,this.listener=e,document.addEventListener("click",(t=>{console.log("onClick"),this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();e&&"Range"==e.type||t.target instanceof Element&&this.nearestInteractiveElement(t.target)||(console.log("tap detected"),this.listener.onTap(t),t.stopPropagation(),t.preventDefault())}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t.outerHTML:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,h,n,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},new i(e,{onTap:t=>{a.onTap({x:t.clientX,y:t.clientY})}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{a.onTap(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,h,o),this.metaViewport=n}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),n={width:s,height:h},a={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,n,a);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}class h{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}}const n=document.getElementById("page-left"),a=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,n,a){const o=new h(a);this.manager=new s(t,e,i,n,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,h,n){const a={width:t,height:e},o={top:i,left:n,bottom:h,right:s};this.manager.setViewport(a,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,n,a,o,window.gestures)}(); +//# sourceMappingURL=fixed-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-double-script.js.map b/readium/navigators/web/scripts/dist/fixed-double-script.js.map new file mode 100644 index 0000000000..10fb36ad65 --- /dev/null +++ b/readium/navigators/web/scripts/dist/fixed-double-script.js.map @@ -0,0 +1 @@ +{"version":3,"file":"fixed-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n console.log(`onmessage ${message}`);\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n console.log(\"tap detected\");\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const wrapperGesturesListener = {\n onTap: (event) => {\n listener.onTap({ x: event.clientX, y: event.clientY });\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const pageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n listener.onTap(event);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, pageListener);\n this.rightPage = new PageManager(window, rightIframe, pageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","console","log","onMessageFromIframe","postMessage","port2","data","x","y","onTap","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","target","Element","nearestInteractiveElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","clientX","clientY","pageListener","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-injectable-script.js b/readium/navigators/web/scripts/dist/fixed-injectable-script.js new file mode 100644 index 0000000000..e663803c00 --- /dev/null +++ b/readium/navigators/web/scripts/dist/fixed-injectable-script.js @@ -0,0 +1,2 @@ +!function(){"use strict";class e{constructor(e,t){console.log(`Constructing Gesturesdetector for window ${e}`),this.window=e,this.listener=t,document.addEventListener("click",(e=>{console.log("onClick"),this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();t&&"Range"==t.type||e.target instanceof Element&&this.nearestInteractiveElement(e.target)||(console.log("tap detected"),this.listener.onTap(e),e.stopPropagation(),e.preventDefault())}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e.outerHTML:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}window.addEventListener("message",(n=>{if(n.ports[0]){console.log("receiving port");const o=n.ports[0],s=new t(o);new e(window,s)}}));class t{constructor(e){this.messagePort=e}onTap(e){console.log("posting event");const t={x:e.clientX,y:e.clientY};this.messagePort.postMessage(t)}}}(); +//# sourceMappingURL=fixed-injectable-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map b/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map new file mode 100644 index 0000000000..22c6008e17 --- /dev/null +++ b/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map @@ -0,0 +1 @@ +{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAAO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAChBC,QAAQC,IAAI,4CAA4CH,KACxDI,KAAKJ,OAASA,EACdI,KAAKH,SAAWA,EAChBI,SAASC,iBAAiB,SAAUC,IAChCL,QAAQC,IAAI,WACZC,KAAKI,QAAQD,EAAM,IACpB,EAIP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKJ,OAAOW,eAC1BD,GAA+B,SAAlBA,EAAUE,MAMvBL,EAAMM,kBAAkBC,SACxBV,KAAKW,0BAA0BR,EAAMM,UAGzCX,QAAQC,IAAI,gBACZC,KAAKH,SAASe,MAAMT,GACpBA,EAAMU,kBACNV,EAAMW,iBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAAQM,UAQfN,EAAQO,cACDtB,KAAKW,0BAA0BI,EAAQO,eAE3C,IACX,ECxDJ1B,OAAOM,iBAAiB,WAAYC,IAChC,GAAIA,EAAMoB,MAAM,GAAI,CAChBzB,QAAQC,IAAI,kBACZ,MAAMyB,EAAcrB,EAAMoB,MAAM,GAC1BE,EAAoB,IAAIC,EAA0BF,GACxD,IAAI9B,EAAiBE,OAAQ6B,EACjC,KAEJ,MAAMC,EACF,WAAA/B,CAAY6B,GACRxB,KAAKwB,YAAcA,CACvB,CACA,KAAAZ,CAAMT,GACFL,QAAQC,IAAI,iBACZ,MAAM4B,EAAW,CAAEC,EAAGzB,EAAM0B,QAASC,EAAG3B,EAAM4B,SAC9C/B,KAAKwB,YAAYQ,YAAYL,EACjC,E","sources":["webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/index-fixed-injectable.ts"],"sourcesContent":["export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n console.log(\"tap detected\");\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nwindow.addEventListener(\"message\", (event) => {\n if (event.ports[0]) {\n console.log(\"receiving port\");\n const messagePort = event.ports[0];\n const messagingListener = new MessagingGesturesListener(messagePort);\n new GesturesDetector(window, messagingListener);\n }\n});\nclass MessagingGesturesListener {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n onTap(event) {\n console.log(\"posting event\");\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.messagePort.postMessage(tapEvent);\n }\n}\n"],"names":["GesturesDetector","constructor","window","listener","console","log","this","document","addEventListener","event","onClick","defaultPrevented","selection","getSelection","type","target","Element","nearestInteractiveElement","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","ports","messagePort","messagingListener","MessagingGesturesListener","tapEvent","x","clientX","y","clientY","postMessage"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/public/prepaginated-single-index.html b/readium/navigators/web/scripts/dist/fixed-single-index.html similarity index 85% rename from readium/navigators/web/scripts/public/prepaginated-single-index.html rename to readium/navigators/web/scripts/dist/fixed-single-index.html index dfae3d6ce2..4c8982b165 100644 --- a/readium/navigators/web/scripts/public/prepaginated-single-index.html +++ b/readium/navigators/web/scripts/dist/fixed-single-index.html @@ -34,6 +34,6 @@ - + diff --git a/readium/navigators/web/scripts/dist/fixed-single-script.js b/readium/navigators/web/scripts/dist/fixed-single-script.js new file mode 100644 index 0000000000..8a50ccd1de --- /dev/null +++ b/readium/navigators/web/scripts/dist/fixed-single-script.js @@ -0,0 +1,2 @@ +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{console.log(`onmessage ${t}`),this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y&&this.listener.onTap({x:t.data.x,y:t.data.y})}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),o=parseFloat(i.get("height"));return n&&o?{width:n,height:o}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){console.log(`Constructing Gesturesdetector for window ${t}`),this.window=t,this.listener=e,document.addEventListener("click",(t=>{console.log("onClick"),this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();e&&"Range"==e.type||t.target instanceof Element&&this.nearestInteractiveElement(t.target)||(console.log("tap detected"),this.listener.onTap(t),t.stopPropagation(),t.preventDefault())}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t.outerHTML:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,o){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,new i(e,{onTap:t=>{var i,s,a;console.log(`metaViewport ${n.content}`);const h=e.document.documentElement;console.log(`docElement ${h.scrollLeft} ${h.scrollTop}`),console.log(`scale ${null===(i=e.visualViewport)||void 0===i?void 0:i.scale}`),console.log(`visualviewport ${null===(s=e.visualViewport)||void 0===s?void 0:s.width} ${null===(a=e.visualViewport)||void 0===a?void 0:a.height}`);const l={x:t.clientX*this.scale/(e.visualViewport.scale*this.scale),y:t.clientY*this.scale/(e.visualViewport.scale*this.scale)};o.onTap(l)}}),this.metaViewport=n;const a={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{var i,n,a;const h=e.document.documentElement;console.log(`docElement ${h.scrollLeft} ${h.scrollTop}`),console.log(`scale ${null===(i=e.visualViewport)||void 0===i?void 0:i.scale}`),console.log(`visualviewport ${null===(n=e.visualViewport)||void 0===n?void 0:n.width} ${null===(a=e.visualViewport)||void 0===a?void 0:a.height}`);const l=s.getBoundingClientRect();console.log(`boundingRect $} ${l.left} ${l.top}`);const r={x:(t.x+l.left)*this.scale/(e.visualViewport.scale*this.scale),y:(t.y+l.top)*this.scale/(e.visualViewport.scale*this.scale)};o.onTap(r)}};this.page=new t(e,s,a)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}}const o=document.getElementById("page"),a=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,o){const a=new n(o);this.manager=new s(t,e,i,a)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,o){const a={width:t,height:e},h={top:i,left:o,bottom:n,right:s};this.manager.setViewport(a,h)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,o,a,window.gestures)}(); +//# sourceMappingURL=fixed-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-single-script.js.map b/readium/navigators/web/scripts/dist/fixed-single-script.js.map new file mode 100644 index 0000000000..4cd16539e0 --- /dev/null +++ b/readium/navigators/web/scripts/dist/fixed-single-script.js.map @@ -0,0 +1 @@ +{"version":3,"file":"fixed-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n console.log(`onmessage ${message}`);\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n console.log(\"tap detected\");\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n const wrapperGesturesListener = {\n onTap: (event) => {\n var _a, _b, _c;\n console.log(`metaViewport ${metaViewport.content}`);\n const docElement = window.document.documentElement;\n console.log(`docElement ${docElement.scrollLeft} ${docElement.scrollTop}`);\n console.log(`scale ${(_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale}`);\n console.log(`visualviewport ${(_b = window.visualViewport) === null || _b === void 0 ? void 0 : _b.width} ${(_c = window.visualViewport) === null || _c === void 0 ? void 0 : _c.height}`);\n const tapEvent = {\n x: (event.clientX * this.scale) /\n (window.visualViewport.scale * this.scale),\n y: (event.clientY * this.scale) /\n (window.visualViewport.scale * this.scale),\n };\n listener.onTap(tapEvent);\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n var _a, _b, _c;\n const docElement = window.document.documentElement;\n console.log(`docElement ${docElement.scrollLeft} ${docElement.scrollTop}`);\n console.log(`scale ${(_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale}`);\n console.log(`visualviewport ${(_b = window.visualViewport) === null || _b === void 0 ? void 0 : _b.width} ${(_c = window.visualViewport) === null || _c === void 0 ? void 0 : _c.height}`);\n const boundingRect = iframe.getBoundingClientRect();\n console.log(`boundingRect $} ${boundingRect.left} ${boundingRect.top}`);\n const tapEvent = {\n x: ((event.x + boundingRect.left) * this.scale) /\n (window.visualViewport.scale * this.scale),\n y: ((event.y + boundingRect.top) * this.scale) /\n (window.visualViewport.scale * this.scale),\n };\n listener.onTap(tapEvent);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","console","log","onMessageFromIframe","postMessage","port2","data","x","y","onTap","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","target","Element","nearestInteractiveElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","SingleAreaManager","metaViewport","fit","insets","_a","_b","_c","docElement","documentElement","scrollLeft","scrollTop","visualViewport","tapEvent","clientX","clientY","pageListener","boundingRect","getBoundingClientRect","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-double-script.js b/readium/navigators/web/scripts/dist/prepaginated-double-script.js deleted file mode 100644 index d51c7d9b5c..0000000000 --- a/readium/navigators/web/scripts/dist/prepaginated-double-script.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),a=parseFloat(e.get("height"));return h&&a?{width:h,height:a}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const e={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(e),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:h},r={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},n=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,a,r);this.metaViewport.content=(new i).setInitialScale(n).setMinimumScale(n).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),a=new e(i,s,h);t.loadSpread=function(t){a.loadSpread(t)},t.setViewport=function(t,i,e,s,h,r){const n={width:t,height:i},o={top:e,left:r,bottom:h,right:s};a.setViewport(n,o)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);a.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); -//# sourceMappingURL=prepaginated-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map deleted file mode 100644 index 4eac876379..0000000000 --- a/readium/navigators/web/scripts/dist/prepaginated-double-script.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = {\n onIframeLoaded: () => {\n this.layout();\n },\n };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js b/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js deleted file mode 100644 index ab10035621..0000000000 --- a/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(){"use strict";new class{constructor(e,t){this.window=e,this.listener=t,e.addEventListener("DOMContentLoaded",(()=>{document.addEventListener("click",(e=>{this.onClick(e)}),!1)}))}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();t&&"Range"==t.type||e.target instanceof Element&&this.nearestInteractiveElement(e.target)||(this.listener.onTap(e),e.stopPropagation(),e.preventDefault())}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e.outerHTML:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}(window,new class{constructor(e){this.listener=e}onTap(e){const t={x:e.clientX,y:e.clientY};this.listener.onTap(JSON.stringify(t))}}(window.gestures))}(); -//# sourceMappingURL=prepaginated-injectable-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js.map deleted file mode 100644 index f7facf1ed7..0000000000 --- a/readium/navigators/web/scripts/dist/prepaginated-injectable-script.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"prepaginated-injectable-script.js","mappings":"yBAUA,ICVO,MACH,WAAAA,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBD,EAAOG,iBAAiB,oBAAoB,KACxCC,SAASD,iBAAiB,SAAUE,IAChCH,KAAKI,QAAQD,EAAM,IACpB,EAAM,GAEjB,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC1BD,GAA+B,SAAlBA,EAAUE,MAMvBL,EAAMM,kBAAkBC,SACxBV,KAAKW,0BAA0BR,EAAMM,UAGzCT,KAAKD,SAASa,MAAMT,GACpBA,EAAMU,kBACNV,EAAMW,iBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAAQM,UAQfN,EAAQO,cACDtB,KAAKW,0BAA0BI,EAAQO,eAE3C,IACX,GDnDgBxB,OAAQ,IAT5B,MACI,WAAAD,CAAYE,GACRC,KAAKD,SAAWA,CACpB,CACA,KAAAa,CAAMT,GACF,MAAMoB,EAAW,CAAEC,EAAGrB,EAAMsB,QAASC,EAAGvB,EAAMwB,SAC9C3B,KAAKD,SAASa,MAAMgB,KAAKC,UAAUN,GACvC,GAEoDzB,OAAOgC,U","sources":["webpack://readium-js/./src/index-prepaginated-injectable.ts","webpack://readium-js/./src/common/gestures.ts"],"sourcesContent":["import { GesturesManager } from \"./common/gestures\";\nclass AdapterGesturesListener {\n constructor(listener) {\n this.listener = listener;\n }\n onTap(event) {\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.listener.onTap(JSON.stringify(tapEvent));\n }\n}\nnew GesturesManager(window, new AdapterGesturesListener(window.gestures));\n","export class GesturesManager {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n window.addEventListener(\"DOMContentLoaded\", () => {\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n });\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n"],"names":["constructor","window","listener","this","addEventListener","document","event","onClick","defaultPrevented","selection","getSelection","type","target","Element","nearestInteractiveElement","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","tapEvent","x","clientX","y","clientY","JSON","stringify","gestures"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-single-script.js b/readium/navigators/web/scripts/dist/prepaginated-single-script.js deleted file mode 100644 index 3f81f03ce9..0000000000 --- a/readium/navigators/web/scripts/dist/prepaginated-single-script.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,e);this.metaViewport.content=(new i).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:a,bottom:n,right:s};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); -//# sourceMappingURL=prepaginated-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map b/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map deleted file mode 100644 index ba21ab4111..0000000000 --- a/readium/navigators/web/scripts/dist/prepaginated-single-script.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/public/fixed-double-index.html b/readium/navigators/web/scripts/public/fixed-double-index.html new file mode 100644 index 0000000000..cc3c0ad854 --- /dev/null +++ b/readium/navigators/web/scripts/public/fixed-double-index.html @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + +
      + + + +
      + + + + diff --git a/readium/navigators/web/scripts/public/fixed-single-index.html b/readium/navigators/web/scripts/public/fixed-single-index.html new file mode 100644 index 0000000000..4c8982b165 --- /dev/null +++ b/readium/navigators/web/scripts/public/fixed-single-index.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + + +
      + +
      + + + diff --git a/readium/navigators/web/scripts/src/bridge/fixed-double-bridge.ts b/readium/navigators/web/scripts/src/bridge/fixed-double-bridge.ts new file mode 100644 index 0000000000..d5be6cd6f1 --- /dev/null +++ b/readium/navigators/web/scripts/src/bridge/fixed-double-bridge.ts @@ -0,0 +1,55 @@ +import { Insets, Size } from "../common/types" +import { DoubleAreaManager } from "../fixed/double-area-manager" +import { GesturesBridge, BridgeGesturesAdapter } from "./fixed-gestures-bridge" +import { Fit } from "../util/fit" + +export class FixedDoubleBridge { + private readonly manager: DoubleAreaManager + + constructor( + window: Window, + leftIframe: HTMLIFrameElement, + rightIframe: HTMLIFrameElement, + metaViewport: HTMLMetaElement, + gestures: GesturesBridge + ) { + const listener = new BridgeGesturesAdapter(gestures) + this.manager = new DoubleAreaManager( + window, + leftIframe, + rightIframe, + metaViewport, + listener + ) + } + + loadSpread(spread: { left?: string; right?: string }) { + this.manager.loadSpread(spread) + } + + setViewport( + viewporttWidth: number, + viewportHeight: number, + insetTop: number, + insetRight: number, + insetBottom: number, + insetLeft: number + ) { + const viewport: Size = { width: viewporttWidth, height: viewportHeight } + const insets: Insets = { + top: insetTop, + left: insetLeft, + bottom: insetBottom, + right: insetRight, + } + this.manager.setViewport(viewport, insets) + } + + setFit(fit: string) { + if (fit != "contain" && fit != "width" && fit != "height") { + throw Error(`Invalid fit value: ${fit}`) + } + + this.manager.setFit(fit as Fit) + } +} diff --git a/readium/navigators/web/scripts/src/bridge/fixed-gestures-bridge.ts b/readium/navigators/web/scripts/src/bridge/fixed-gestures-bridge.ts new file mode 100644 index 0000000000..0064c51916 --- /dev/null +++ b/readium/navigators/web/scripts/src/bridge/fixed-gestures-bridge.ts @@ -0,0 +1,22 @@ +import { AreaManager } from "../fixed/area-manager" + +export interface GesturesBridge { + onTap(event: string): void +} + +export interface TapEvent { + x: number + y: number +} + +export class BridgeGesturesAdapter implements AreaManager.Listener { + readonly nativeApi: GesturesBridge + + constructor(gesturesApi: GesturesBridge) { + this.nativeApi = gesturesApi + } + + onTap(event: TapEvent): void { + this.nativeApi.onTap(JSON.stringify(event)) + } +} diff --git a/readium/navigators/web/scripts/src/bridge/fixed-single-bridge.ts b/readium/navigators/web/scripts/src/bridge/fixed-single-bridge.ts new file mode 100644 index 0000000000..96e8fb7fb0 --- /dev/null +++ b/readium/navigators/web/scripts/src/bridge/fixed-single-bridge.ts @@ -0,0 +1,48 @@ +import { Insets, Size } from "../common/types" +import { SingleAreaManager } from "../fixed/single-area-manager" +import { Fit } from "../util/fit" +import { GesturesBridge, BridgeGesturesAdapter } from "./fixed-gestures-bridge" + +export class FixedSingleBridge { + private readonly manager: SingleAreaManager + + constructor( + window: Window, + iframe: HTMLIFrameElement, + metaViewport: HTMLMetaElement, + gestures: GesturesBridge + ) { + const listener = new BridgeGesturesAdapter(gestures) + this.manager = new SingleAreaManager(window, iframe, metaViewport, listener) + } + + loadResource(url: string) { + this.manager.loadResource(url) + } + + setViewport( + viewporttWidth: number, + viewportHeight: number, + insetTop: number, + insetRight: number, + insetBottom: number, + insetLeft: number + ) { + const viewport: Size = { width: viewporttWidth, height: viewportHeight } + const insets: Insets = { + top: insetTop, + left: insetLeft, + bottom: insetBottom, + right: insetRight, + } + this.manager.setViewport(viewport, insets) + } + + setFit(fit: string) { + if (fit != "contain" && fit != "width" && fit != "height") { + throw Error(`Invalid fit value: ${fit}`) + } + + this.manager.setFit(fit as Fit) + } +} diff --git a/readium/navigators/web/scripts/src/common/events.ts b/readium/navigators/web/scripts/src/common/events.ts new file mode 100644 index 0000000000..5a6af1ab2f --- /dev/null +++ b/readium/navigators/web/scripts/src/common/events.ts @@ -0,0 +1,4 @@ +export interface TapEvent { + x: number + y: number +} diff --git a/readium/navigators/web/scripts/src/common/gestures.ts b/readium/navigators/web/scripts/src/common/gestures.ts index cf1a00e82d..a8be158aa6 100644 --- a/readium/navigators/web/scripts/src/common/gestures.ts +++ b/readium/navigators/web/scripts/src/common/gestures.ts @@ -2,23 +2,26 @@ export interface GesturesListener { onTap(event: MouseEvent): void } -export class GesturesManager { +export class GesturesDetector { private readonly listener: GesturesListener private readonly window: Window constructor(window: Window, listener: GesturesListener) { + console.log(`Constructing Gesturesdetector for window ${window}`) this.window = window this.listener = listener - window.addEventListener("DOMContentLoaded", () => { - document.addEventListener( - "click", - (event) => { - this.onClick(event) - }, - false - ) - }) + document.addEventListener( + "click", + (event) => { + console.log("onClick") + this.onClick(event) + }, + false + ) + /*document.addEventListener("DOMContentLoaded", () => { + console.log("DOM content loaded") + })*/ } private onClick(event: MouseEvent) { @@ -41,6 +44,7 @@ export class GesturesManager { return } + console.log("tap detected") this.listener.onTap(event) event.stopPropagation() diff --git a/readium/navigators/web/scripts/src/fixed/area-manager.ts b/readium/navigators/web/scripts/src/fixed/area-manager.ts new file mode 100644 index 0000000000..5d4d2a6873 --- /dev/null +++ b/readium/navigators/web/scripts/src/fixed/area-manager.ts @@ -0,0 +1,7 @@ +import { TapEvent } from "../common/events" + +export namespace AreaManager { + export interface Listener { + onTap(event: TapEvent): void + } +} diff --git a/readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts b/readium/navigators/web/scripts/src/fixed/double-area-manager.ts similarity index 80% rename from readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts rename to readium/navigators/web/scripts/src/fixed/double-area-manager.ts index 6d67f25f2f..fca456edff 100644 --- a/readium/navigators/web/scripts/src/prepaginated/double-area-manager.ts +++ b/readium/navigators/web/scripts/src/fixed/double-area-manager.ts @@ -1,7 +1,10 @@ import { Size, Insets } from "../common/types" import { computeScale, Fit } from "../util/fit" import { PageManager } from "./page-manager" +import { AreaManager } from "./area-manager" import { ViewportStringBuilder } from "../util/viewport" +import { GesturesDetector } from "../common/gestures" +import { TapEvent } from "../common/events" export class DoubleAreaManager { private readonly metaViewport: HTMLMetaElement @@ -19,17 +22,29 @@ export class DoubleAreaManager { private spread?: { left?: string; right?: string } constructor( + window: Window, leftIframe: HTMLIFrameElement, rightIframe: HTMLIFrameElement, - metaViewport: HTMLMetaElement + metaViewport: HTMLMetaElement, + listener: AreaManager.Listener ) { - const listener = { + const wrapperGesturesListener = { + onTap: (event: MouseEvent) => { + listener.onTap({ x: event.clientX, y: event.clientY }) + }, + } + new GesturesDetector(window, wrapperGesturesListener) + + const pageListener = { onIframeLoaded: () => { this.layout() }, + onTap: (event: TapEvent) => { + listener.onTap(event) + }, } - this.leftPage = new PageManager(leftIframe, listener) - this.rightPage = new PageManager(rightIframe, listener) + this.leftPage = new PageManager(window, leftIframe, pageListener) + this.rightPage = new PageManager(window, rightIframe, pageListener) this.metaViewport = metaViewport } diff --git a/readium/navigators/web/scripts/src/prepaginated/page-manager.ts b/readium/navigators/web/scripts/src/fixed/page-manager.ts similarity index 80% rename from readium/navigators/web/scripts/src/prepaginated/page-manager.ts rename to readium/navigators/web/scripts/src/fixed/page-manager.ts index 69ac333403..85269ad018 100644 --- a/readium/navigators/web/scripts/src/prepaginated/page-manager.ts +++ b/readium/navigators/web/scripts/src/fixed/page-manager.ts @@ -1,4 +1,5 @@ import { Margins, Size } from "../common/types" +import { TapEvent } from "../common/events" /** Manages a fixed layout resource embedded in an iframe. */ export class PageManager { @@ -8,9 +9,15 @@ export class PageManager { private margins: Margins = { top: 0, right: 0, bottom: 0, left: 0 } + private readonly channel = new MessageChannel() + size?: Size - constructor(iframe: HTMLIFrameElement, listener: PageManager.Listener) { + constructor( + window: Window, + iframe: HTMLIFrameElement, + listener: PageManager.Listener + ) { if (!iframe.contentWindow) { throw Error("Iframe argument must have been attached to DOM.") } @@ -71,9 +78,22 @@ export class PageManager { this.iframe.style.width = pageSize.width + "px" this.iframe.style.height = pageSize.height + "px" this.size = pageSize + + this.channel.port1.onmessage = (message) => { + console.log(`onmessage ${message}`) + this.onMessageFromIframe(message) + } + this.iframe.contentWindow!.postMessage("Init", "*", [this.channel.port2]) + this.listener.onIframeLoaded() } + private onMessageFromIframe(message: MessageEvent) { + if (message.data.x && message.data.y) { + this.listener.onTap({ x: message.data.x, y: message.data.y }) + } + } + /** Parses the page size from the viewport meta tag of the loaded resource. */ private parsePageSize(viewportMeta: HTMLMetaElement): Size | undefined { const regex = /(\w+) *= *([^\s,]+)/g @@ -98,5 +118,6 @@ export class PageManager { export namespace PageManager { export interface Listener { onIframeLoaded(): void + onTap(event: TapEvent): void } } diff --git a/readium/navigators/web/scripts/src/fixed/single-area-manager.ts b/readium/navigators/web/scripts/src/fixed/single-area-manager.ts new file mode 100644 index 0000000000..0ba3965bdc --- /dev/null +++ b/readium/navigators/web/scripts/src/fixed/single-area-manager.ts @@ -0,0 +1,144 @@ +import { Insets, Size } from "../common/types" +import { computeScale, Fit } from "../util/fit" +import { PageManager } from "./page-manager" +import { ViewportStringBuilder } from "../util/viewport" +import { AreaManager } from "./area-manager" +import { GesturesDetector } from "../common/gestures" +import { TapEvent } from "../common/events" + +export class SingleAreaManager { + private readonly metaViewport: HTMLMetaElement + + private readonly page: PageManager + + private fit: Fit = Fit.Contain + + private insets: Insets = { top: 0, right: 0, bottom: 0, left: 0 } + + private viewport?: Size + + private scale: number = 1 + + constructor( + window: Window, + iframe: HTMLIFrameElement, + metaViewport: HTMLMetaElement, + listener: AreaManager.Listener + ) { + const wrapperGesturesListener = { + onTap: (event: MouseEvent) => { + console.log(`metaViewport ${metaViewport.content}`) + const docElement = window.document.documentElement + console.log( + `docElement ${docElement.scrollLeft} ${docElement.scrollTop}` + ) + console.log(`scale ${window.visualViewport?.scale}`) + console.log( + `visualviewport ${window.visualViewport?.width} ${window.visualViewport?.height}` + ) + + const tapEvent = { + x: + (event.clientX * this.scale) / + (window.visualViewport!.scale * this.scale), + y: + (event.clientY * this.scale) / + (window.visualViewport!.scale * this.scale), + } + listener.onTap(tapEvent) + }, + } + new GesturesDetector(window, wrapperGesturesListener) + + this.metaViewport = metaViewport + const pageListener = { + onIframeLoaded: () => { + this.onIframeLoaded() + }, + onTap: (event: TapEvent) => { + const docElement = window.document.documentElement + console.log( + `docElement ${docElement.scrollLeft} ${docElement.scrollTop}` + ) + console.log(`scale ${window.visualViewport?.scale}`) + console.log( + `visualviewport ${window.visualViewport?.width} ${window.visualViewport?.height}` + ) + const boundingRect = iframe.getBoundingClientRect() + console.log(`boundingRect $} ${boundingRect.left} ${boundingRect.top}`) + const tapEvent = { + x: + ((event.x + boundingRect.left) * this.scale) / + (window.visualViewport!.scale * this.scale), + y: + ((event.y + boundingRect.top) * this.scale) / + (window.visualViewport!.scale * this.scale), + } + listener.onTap(tapEvent) + }, + } + this.page = new PageManager(window, iframe, pageListener) + } + + setViewport(viewport: Size, insets: Insets) { + if (this.viewport == viewport && this.insets == insets) { + return + } + + this.viewport = viewport + this.insets = insets + this.layout() + } + + setFit(fit: Fit) { + if (this.fit == fit) { + return + } + + this.fit = fit + this.layout() + } + + loadResource(url: string) { + this.page.hide() + this.page.loadPage(url) + } + + private onIframeLoaded() { + if (!this.page.size) { + // FIXME: raise error + } else { + this.layout() + } + } + + private layout() { + if (!this.page.size || !this.viewport) { + return + } + + const margins = { + top: this.insets.top, + right: this.insets.right, + bottom: this.insets.bottom, + left: this.insets.left, + } + this.page.setMargins(margins) + + const safeDrawingSize = { + width: this.viewport.width - this.insets.left - this.insets.right, + height: this.viewport.height - this.insets.top - this.insets.bottom, + } + const scale = computeScale(this.fit, this.page.size, safeDrawingSize) + this.metaViewport.content = new ViewportStringBuilder() + .setInitialScale(scale) + .setMinimumScale(scale) + .setWidth(this.page.size.width) + .setHeight(this.page.size.height) + .build() + + this.scale = scale + + this.page.show() + } +} diff --git a/readium/navigators/web/scripts/src/index-fixed-double.ts b/readium/navigators/web/scripts/src/index-fixed-double.ts new file mode 100644 index 0000000000..e7c8819a13 --- /dev/null +++ b/readium/navigators/web/scripts/src/index-fixed-double.ts @@ -0,0 +1,35 @@ +// +// Copyright 2024 Readium Foundation. All rights reserved. +// Use of this source code is governed by the BSD-style license +// available in the top-level LICENSE file of the project. +// + +/** + * Script loaded by the single area HTML wrapper for fixed layout resources. + */ + +import { GesturesBridge } from "./bridge/fixed-gestures-bridge" +import { FixedDoubleBridge } from "./bridge/fixed-double-bridge" + +declare global { + interface Window { + doubleArea: FixedDoubleBridge + gestures: GesturesBridge + } +} + +const leftIframe = document.getElementById("page-left") as HTMLIFrameElement + +const rightIframe = document.getElementById("page-right") as HTMLIFrameElement + +const metaViewport = document.querySelector( + "meta[name=viewport]" +) as HTMLMetaElement + +Window.prototype.doubleArea = new FixedDoubleBridge( + window, + leftIframe, + rightIframe, + metaViewport, + window.gestures +) diff --git a/readium/navigators/web/scripts/src/index-fixed-injectable.ts b/readium/navigators/web/scripts/src/index-fixed-injectable.ts new file mode 100644 index 0000000000..f06eea41d5 --- /dev/null +++ b/readium/navigators/web/scripts/src/index-fixed-injectable.ts @@ -0,0 +1,34 @@ +// +// Copyright 2024 Readium Foundation. All rights reserved. +// Use of this source code is governed by the BSD-style license +// available in the top-level LICENSE file of the project. +// + +/** + * Script loaded by fixed layout resources. + */ + +import { GesturesDetector, GesturesListener } from "./common/gestures" + +window.addEventListener("message", (event) => { + if (event.ports[0]) { + console.log("receiving port") + const messagePort = event.ports[0] + const messagingListener = new MessagingGesturesListener(messagePort) + new GesturesDetector(window, messagingListener) + } +}) + +class MessagingGesturesListener implements GesturesListener { + readonly messagePort: MessagePort + + constructor(messagePort: MessagePort) { + this.messagePort = messagePort + } + + onTap(event: MouseEvent): void { + console.log("posting event") + const tapEvent = { x: event.clientX, y: event.clientY } + this.messagePort.postMessage(tapEvent) + } +} diff --git a/readium/navigators/web/scripts/src/index-fixed-single.ts b/readium/navigators/web/scripts/src/index-fixed-single.ts new file mode 100644 index 0000000000..f5041fc5d1 --- /dev/null +++ b/readium/navigators/web/scripts/src/index-fixed-single.ts @@ -0,0 +1,32 @@ +// +// Copyright 2024 Readium Foundation. All rights reserved. +// Use of this source code is governed by the BSD-style license +// available in the top-level LICENSE file of the project. +// + +/** + * Script loaded by the single area HTML wrapper for fixed layout resources. + */ + +import { GesturesBridge } from "./bridge/fixed-gestures-bridge" +import { FixedSingleBridge } from "./bridge/fixed-single-bridge" + +declare global { + interface Window { + singleArea: FixedSingleBridge + gestures: GesturesBridge + } +} + +const iframe = document.getElementById("page") as HTMLIFrameElement + +const metaViewport = document.querySelector( + "meta[name=viewport]" +) as HTMLMetaElement + +window.singleArea = new FixedSingleBridge( + window, + iframe, + metaViewport, + window.gestures +) diff --git a/readium/navigators/web/scripts/src/index-prepaginated-double.ts b/readium/navigators/web/scripts/src/index-prepaginated-double.ts deleted file mode 100644 index 454b34a799..0000000000 --- a/readium/navigators/web/scripts/src/index-prepaginated-double.ts +++ /dev/null @@ -1,59 +0,0 @@ -// -// Copyright 2021 Readium Foundation. All rights reserved. -// Use of this source code is governed by the BSD-style license -// available in the top-level LICENSE file of the project. -// - -import { Insets, Size } from "./common/types" -import { DoubleAreaManager } from "./prepaginated/double-area-manager" -import { Fit } from "./util/fit" - -namespace Layout { - const leftIframe = document.getElementById("page-left") as HTMLIFrameElement - - const rightIframe = document.getElementById("page-right") as HTMLIFrameElement - - const metaViewport = document.querySelector( - "meta[name=viewport]" - ) as HTMLMetaElement - - const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport) - - export function loadSpread(spread: { left?: string; right?: string }) { - manager.loadSpread(spread) - } - - export function setViewport( - viewporttWidth: number, - viewportHeight: number, - insetTop: number, - insetRight: number, - insetBottom: number, - insetLeft: number - ) { - const viewport: Size = { width: viewporttWidth, height: viewportHeight } - const insets: Insets = { - top: insetTop, - left: insetLeft, - bottom: insetBottom, - right: insetRight, - } - manager.setViewport(viewport, insets) - } - - export function setFit(fit: string) { - if (fit != "contain" && fit != "width" && fit != "height") { - throw Error(`Invalid fit value: ${fit}`) - } - - manager.setFit(fit as Fit) - } -} - -declare global { - interface Window { - layout: any - } -} - -Window.prototype.layout = Layout diff --git a/readium/navigators/web/scripts/src/index-prepaginated-injectable.ts b/readium/navigators/web/scripts/src/index-prepaginated-injectable.ts deleted file mode 100644 index d9a3d04aa4..0000000000 --- a/readium/navigators/web/scripts/src/index-prepaginated-injectable.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { GesturesManager, GesturesListener } from "./common/gestures" - -interface Listener { - onTap(event: string): void -} - -interface TapEvent { - x: number - - y: number -} - -declare global { - interface Window { - gestures: Listener - } -} - -class AdapterGesturesListener implements GesturesListener { - readonly listener: Listener - - constructor(listener: Listener) { - this.listener = listener - } - - onTap(event: MouseEvent): void { - const tapEvent: TapEvent = { x: event.clientX, y: event.clientY } - this.listener.onTap(JSON.stringify(tapEvent)) - } -} - -new GesturesManager(window, new AdapterGesturesListener(window.gestures)) diff --git a/readium/navigators/web/scripts/src/index-prepaginated-single.ts b/readium/navigators/web/scripts/src/index-prepaginated-single.ts deleted file mode 100644 index 65603ade38..0000000000 --- a/readium/navigators/web/scripts/src/index-prepaginated-single.ts +++ /dev/null @@ -1,69 +0,0 @@ -// -// Copyright 2021 Readium Foundation. All rights reserved. -// Use of this source code is governed by the BSD-style license -// available in the top-level LICENSE file of the project. -// - -import { Insets, Size } from "./common/types" -import { Fit } from "./util/fit" -import { SingleAreaManager } from "./prepaginated/single-area-manager" - -// Script used for the single spread wrapper HTML page for fixed layout resources. - -/*class WebListener implements SingleAreaManager.Listener{ - - onError(error: SingleAreaManager.Error): void { - console.error(error); - } -} - -//declare let listener: FixedPageManager.Listener -const listener = new WebListener();*/ - -namespace Layout { - const iframe = document.getElementById("page") as HTMLIFrameElement - - const metaViewport = document.querySelector( - "meta[name=viewport]" - ) as HTMLMetaElement - - const manager = new SingleAreaManager(iframe, metaViewport) - - export function loadResource(url: string) { - manager.loadResource(url) - } - - export function setViewport( - viewporttWidth: number, - viewportHeight: number, - insetTop: number, - insetRight: number, - insetBottom: number, - insetLeft: number - ) { - const viewport: Size = { width: viewporttWidth, height: viewportHeight } - const insets: Insets = { - top: insetTop, - left: insetLeft, - bottom: insetBottom, - right: insetRight, - } - manager.setViewport(viewport, insets) - } - - export function setFit(fit: string) { - if (fit != "contain" && fit != "width" && fit != "height") { - throw Error(`Invalid fit value: ${fit}`) - } - - manager.setFit(fit as Fit) - } -} - -declare global { - interface Window { - layout: any - } -} - -Window.prototype.layout = Layout diff --git a/readium/navigators/web/scripts/src/prepaginated/single-area-manager.ts b/readium/navigators/web/scripts/src/prepaginated/single-area-manager.ts deleted file mode 100644 index 80a743fa44..0000000000 --- a/readium/navigators/web/scripts/src/prepaginated/single-area-manager.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { Insets, Size } from "../common/types" -import { computeScale, Fit } from "../util/fit" -import { PageManager } from "./page-manager" -import { ViewportStringBuilder } from "../util/viewport" - -export class SingleAreaManager { - private readonly metaViewport: HTMLMetaElement - - private readonly page: PageManager - - private fit: Fit = Fit.Contain - - private insets: Insets = { top: 0, right: 0, bottom: 0, left: 0 } - - private viewport?: Size - - constructor(iframe: HTMLIFrameElement, metaViewport: HTMLMetaElement) { - this.metaViewport = metaViewport - const listener = { - onIframeLoaded: () => { - this.onIframeLoaded() - }, - } - this.page = new PageManager(iframe, listener) - } - - setViewport(viewport: Size, insets: Insets) { - if (this.viewport == viewport && this.insets == insets) { - return - } - - this.viewport = viewport - this.insets = insets - this.layout() - } - - setFit(fit: Fit) { - if (this.fit == fit) { - return - } - - this.fit = fit - this.layout() - } - - loadResource(url: string) { - this.page.hide() - this.page.loadPage(url) - } - - private onIframeLoaded() { - if (!this.page.size) { - // FIXME: raise error - } else { - this.layout() - } - } - - private layout() { - if (!this.page.size || !this.viewport) { - return - } - - const margins = { - top: this.insets.top, - right: this.insets.right, - bottom: this.insets.bottom, - left: this.insets.left, - } - this.page.setMargins(margins) - - const safeDrawingSize = { - width: this.viewport.width - this.insets.left - this.insets.right, - height: this.viewport.height - this.insets.top - this.insets.bottom, - } - const scale = computeScale(this.fit, this.page.size, safeDrawingSize) - this.metaViewport.content = new ViewportStringBuilder() - .setInitialScale(scale) - .setMinimumScale(scale) - .setWidth(this.page.size.width) - .setHeight(this.page.size.height) - .build() - - this.page.show() - } -} diff --git a/readium/navigators/web/scripts/webpack.config.js b/readium/navigators/web/scripts/webpack.config.js index 24986431b6..a811aba7f1 100644 --- a/readium/navigators/web/scripts/webpack.config.js +++ b/readium/navigators/web/scripts/webpack.config.js @@ -5,9 +5,9 @@ module.exports = { mode: "production", devtool: "source-map", entry: { - "prepaginated-single-script": "./src/index-prepaginated-single.ts", - "prepaginated-double-script": "./src/index-prepaginated-double.ts", - "prepaginated-injectable-script": "./src/index-prepaginated-injectable.ts", + "fixed-single-script": "./src/index-fixed-single.ts", + "fixed-double-script": "./src/index-fixed-double.ts", + "fixed-injectable-script": "./src/index-fixed-injectable.ts", }, resolve: { // Add '.ts' and '.tsx' as resolvable extensions. diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-index.html b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-index.html new file mode 100644 index 0000000000..cc3c0ad854 --- /dev/null +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-index.html @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + +
      + + + +
      + + + + diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js new file mode 100644 index 0000000000..27bb8eb5ea --- /dev/null +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js @@ -0,0 +1,2 @@ +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{console.log(`onmessage ${t}`),this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y&&this.listener.onTap({x:t.data.x,y:t.data.y})}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const h=parseFloat(i.get("width")),n=parseFloat(i.get("height"));return h&&n?{width:h,height:n}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){console.log(`Constructing Gesturesdetector for window ${t}`),this.window=t,this.listener=e,document.addEventListener("click",(t=>{console.log("onClick"),this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();e&&"Range"==e.type||t.target instanceof Element&&this.nearestInteractiveElement(t.target)||(console.log("tap detected"),this.listener.onTap(t),t.stopPropagation(),t.preventDefault())}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t.outerHTML:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,h,n,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},new i(e,{onTap:t=>{a.onTap({x:t.clientX,y:t.clientY})}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{a.onTap(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,h,o),this.metaViewport=n}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),n={width:s,height:h},a={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,n,a);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}class h{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}}const n=document.getElementById("page-left"),a=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,n,a){const o=new h(a);this.manager=new s(t,e,i,n,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,h,n){const a={width:t,height:e},o={top:i,left:n,bottom:h,right:s};this.manager.setViewport(a,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,n,a,o,window.gestures)}(); +//# sourceMappingURL=fixed-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map new file mode 100644 index 0000000000..10fb36ad65 --- /dev/null +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map @@ -0,0 +1 @@ +{"version":3,"file":"fixed-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n console.log(`onmessage ${message}`);\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n console.log(\"tap detected\");\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a
      .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const wrapperGesturesListener = {\n onTap: (event) => {\n listener.onTap({ x: event.clientX, y: event.clientY });\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const pageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n listener.onTap(event);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, pageListener);\n this.rightPage = new PageManager(window, rightIframe, pageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","console","log","onMessageFromIframe","postMessage","port2","data","x","y","onTap","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","target","Element","nearestInteractiveElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","clientX","clientY","pageListener","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js new file mode 100644 index 0000000000..e663803c00 --- /dev/null +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js @@ -0,0 +1,2 @@ +!function(){"use strict";class e{constructor(e,t){console.log(`Constructing Gesturesdetector for window ${e}`),this.window=e,this.listener=t,document.addEventListener("click",(e=>{console.log("onClick"),this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();t&&"Range"==t.type||e.target instanceof Element&&this.nearestInteractiveElement(e.target)||(console.log("tap detected"),this.listener.onTap(e),e.stopPropagation(),e.preventDefault())}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e.outerHTML:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}window.addEventListener("message",(n=>{if(n.ports[0]){console.log("receiving port");const o=n.ports[0],s=new t(o);new e(window,s)}}));class t{constructor(e){this.messagePort=e}onTap(e){console.log("posting event");const t={x:e.clientX,y:e.clientY};this.messagePort.postMessage(t)}}}(); +//# sourceMappingURL=fixed-injectable-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map new file mode 100644 index 0000000000..22c6008e17 --- /dev/null +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map @@ -0,0 +1 @@ +{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAAO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAChBC,QAAQC,IAAI,4CAA4CH,KACxDI,KAAKJ,OAASA,EACdI,KAAKH,SAAWA,EAChBI,SAASC,iBAAiB,SAAUC,IAChCL,QAAQC,IAAI,WACZC,KAAKI,QAAQD,EAAM,IACpB,EAIP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKJ,OAAOW,eAC1BD,GAA+B,SAAlBA,EAAUE,MAMvBL,EAAMM,kBAAkBC,SACxBV,KAAKW,0BAA0BR,EAAMM,UAGzCX,QAAQC,IAAI,gBACZC,KAAKH,SAASe,MAAMT,GACpBA,EAAMU,kBACNV,EAAMW,iBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAAQM,UAQfN,EAAQO,cACDtB,KAAKW,0BAA0BI,EAAQO,eAE3C,IACX,ECxDJ1B,OAAOM,iBAAiB,WAAYC,IAChC,GAAIA,EAAMoB,MAAM,GAAI,CAChBzB,QAAQC,IAAI,kBACZ,MAAMyB,EAAcrB,EAAMoB,MAAM,GAC1BE,EAAoB,IAAIC,EAA0BF,GACxD,IAAI9B,EAAiBE,OAAQ6B,EACjC,KAEJ,MAAMC,EACF,WAAA/B,CAAY6B,GACRxB,KAAKwB,YAAcA,CACvB,CACA,KAAAZ,CAAMT,GACFL,QAAQC,IAAI,iBACZ,MAAM4B,EAAW,CAAEC,EAAGzB,EAAM0B,QAASC,EAAG3B,EAAM4B,SAC9C/B,KAAKwB,YAAYQ,YAAYL,EACjC,E","sources":["webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/index-fixed-injectable.ts"],"sourcesContent":["export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n console.log(\"tap detected\");\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nwindow.addEventListener(\"message\", (event) => {\n if (event.ports[0]) {\n console.log(\"receiving port\");\n const messagePort = event.ports[0];\n const messagingListener = new MessagingGesturesListener(messagePort);\n new GesturesDetector(window, messagingListener);\n }\n});\nclass MessagingGesturesListener {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n onTap(event) {\n console.log(\"posting event\");\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.messagePort.postMessage(tapEvent);\n }\n}\n"],"names":["GesturesDetector","constructor","window","listener","console","log","this","document","addEventListener","event","onClick","defaultPrevented","selection","getSelection","type","target","Element","nearestInteractiveElement","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","ports","messagePort","messagingListener","MessagingGesturesListener","tapEvent","x","clientX","y","clientY","postMessage"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-index.html b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-index.html new file mode 100644 index 0000000000..4c8982b165 --- /dev/null +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-index.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + + +
      + +
      + + + diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js new file mode 100644 index 0000000000..8a50ccd1de --- /dev/null +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js @@ -0,0 +1,2 @@ +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{console.log(`onmessage ${t}`),this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y&&this.listener.onTap({x:t.data.x,y:t.data.y})}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),o=parseFloat(i.get("height"));return n&&o?{width:n,height:o}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){console.log(`Constructing Gesturesdetector for window ${t}`),this.window=t,this.listener=e,document.addEventListener("click",(t=>{console.log("onClick"),this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();e&&"Range"==e.type||t.target instanceof Element&&this.nearestInteractiveElement(t.target)||(console.log("tap detected"),this.listener.onTap(t),t.stopPropagation(),t.preventDefault())}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t.outerHTML:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,o){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,new i(e,{onTap:t=>{var i,s,a;console.log(`metaViewport ${n.content}`);const h=e.document.documentElement;console.log(`docElement ${h.scrollLeft} ${h.scrollTop}`),console.log(`scale ${null===(i=e.visualViewport)||void 0===i?void 0:i.scale}`),console.log(`visualviewport ${null===(s=e.visualViewport)||void 0===s?void 0:s.width} ${null===(a=e.visualViewport)||void 0===a?void 0:a.height}`);const l={x:t.clientX*this.scale/(e.visualViewport.scale*this.scale),y:t.clientY*this.scale/(e.visualViewport.scale*this.scale)};o.onTap(l)}}),this.metaViewport=n;const a={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{var i,n,a;const h=e.document.documentElement;console.log(`docElement ${h.scrollLeft} ${h.scrollTop}`),console.log(`scale ${null===(i=e.visualViewport)||void 0===i?void 0:i.scale}`),console.log(`visualviewport ${null===(n=e.visualViewport)||void 0===n?void 0:n.width} ${null===(a=e.visualViewport)||void 0===a?void 0:a.height}`);const l=s.getBoundingClientRect();console.log(`boundingRect $} ${l.left} ${l.top}`);const r={x:(t.x+l.left)*this.scale/(e.visualViewport.scale*this.scale),y:(t.y+l.top)*this.scale/(e.visualViewport.scale*this.scale)};o.onTap(r)}};this.page=new t(e,s,a)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}}const o=document.getElementById("page"),a=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,o){const a=new n(o);this.manager=new s(t,e,i,a)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,o){const a={width:t,height:e},h={top:i,left:o,bottom:n,right:s};this.manager.setViewport(a,h)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,o,a,window.gestures)}(); +//# sourceMappingURL=fixed-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map new file mode 100644 index 0000000000..4cd16539e0 --- /dev/null +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map @@ -0,0 +1 @@ +{"version":3,"file":"fixed-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n console.log(`onmessage ${message}`);\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n console.log(\"tap detected\");\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a
      .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n const wrapperGesturesListener = {\n onTap: (event) => {\n var _a, _b, _c;\n console.log(`metaViewport ${metaViewport.content}`);\n const docElement = window.document.documentElement;\n console.log(`docElement ${docElement.scrollLeft} ${docElement.scrollTop}`);\n console.log(`scale ${(_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale}`);\n console.log(`visualviewport ${(_b = window.visualViewport) === null || _b === void 0 ? void 0 : _b.width} ${(_c = window.visualViewport) === null || _c === void 0 ? void 0 : _c.height}`);\n const tapEvent = {\n x: (event.clientX * this.scale) /\n (window.visualViewport.scale * this.scale),\n y: (event.clientY * this.scale) /\n (window.visualViewport.scale * this.scale),\n };\n listener.onTap(tapEvent);\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n var _a, _b, _c;\n const docElement = window.document.documentElement;\n console.log(`docElement ${docElement.scrollLeft} ${docElement.scrollTop}`);\n console.log(`scale ${(_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale}`);\n console.log(`visualviewport ${(_b = window.visualViewport) === null || _b === void 0 ? void 0 : _b.width} ${(_c = window.visualViewport) === null || _c === void 0 ? void 0 : _c.height}`);\n const boundingRect = iframe.getBoundingClientRect();\n console.log(`boundingRect $} ${boundingRect.left} ${boundingRect.top}`);\n const tapEvent = {\n x: ((event.x + boundingRect.left) * this.scale) /\n (window.visualViewport.scale * this.scale),\n y: ((event.y + boundingRect.top) * this.scale) /\n (window.visualViewport.scale * this.scale),\n };\n listener.onTap(tapEvent);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","console","log","onMessageFromIframe","postMessage","port2","data","x","y","onTap","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","target","Element","nearestInteractiveElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","SingleAreaManager","metaViewport","fit","insets","_a","_b","_c","docElement","documentElement","scrollLeft","scrollTop","visualViewport","tapEvent","clientX","clientY","pageListener","boundingRect","getBoundingClientRect","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js deleted file mode 100644 index d51c7d9b5c..0000000000 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),a=parseFloat(e.get("height"));return h&&a?{width:h,height:a}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e,s){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0};const h={onIframeLoaded:()=>{this.layout()}};this.leftPage=new t(i,h),this.rightPage=new t(e,h),this.metaViewport=s}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const e={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(e),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:h},r={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},n=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,a,r);this.metaViewport.content=(new i).setInitialScale(n).setMinimumScale(n).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}var s;!function(t){const i=document.getElementById("page-left"),s=document.getElementById("page-right"),h=document.querySelector("meta[name=viewport]"),a=new e(i,s,h);t.loadSpread=function(t){a.loadSpread(t)},t.setViewport=function(t,i,e,s,h,r){const n={width:t,height:i},o={top:e,left:r,bottom:h,right:s};a.setViewport(n,o)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);a.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); -//# sourceMappingURL=prepaginated-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map deleted file mode 100644 index 4eac876379..0000000000 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-double-script.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"prepaginated-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-double.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class DoubleAreaManager {\n constructor(leftIframe, rightIframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const listener = {\n onIframeLoaded: () => {\n this.layout();\n },\n };\n this.leftPage = new PageManager(leftIframe, listener);\n this.rightPage = new PageManager(rightIframe, listener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { DoubleAreaManager } from \"./prepaginated/double-area-manager\";\nvar Layout;\n(function (Layout) {\n const leftIframe = document.getElementById(\"page-left\");\n const rightIframe = document.getElementById(\"page-right\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new DoubleAreaManager(leftIframe, rightIframe, metaViewport);\n function loadSpread(spread) {\n manager.loadSpread(spread);\n }\n Layout.loadSpread = loadSpread;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js deleted file mode 100644 index ab10035621..0000000000 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(){"use strict";new class{constructor(e,t){this.window=e,this.listener=t,e.addEventListener("DOMContentLoaded",(()=>{document.addEventListener("click",(e=>{this.onClick(e)}),!1)}))}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();t&&"Range"==t.type||e.target instanceof Element&&this.nearestInteractiveElement(e.target)||(this.listener.onTap(e),e.stopPropagation(),e.preventDefault())}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e.outerHTML:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}(window,new class{constructor(e){this.listener=e}onTap(e){const t={x:e.clientX,y:e.clientY};this.listener.onTap(JSON.stringify(t))}}(window.gestures))}(); -//# sourceMappingURL=prepaginated-injectable-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js.map deleted file mode 100644 index f7facf1ed7..0000000000 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-injectable-script.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"prepaginated-injectable-script.js","mappings":"yBAUA,ICVO,MACH,WAAAA,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBD,EAAOG,iBAAiB,oBAAoB,KACxCC,SAASD,iBAAiB,SAAUE,IAChCH,KAAKI,QAAQD,EAAM,IACpB,EAAM,GAEjB,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC1BD,GAA+B,SAAlBA,EAAUE,MAMvBL,EAAMM,kBAAkBC,SACxBV,KAAKW,0BAA0BR,EAAMM,UAGzCT,KAAKD,SAASa,MAAMT,GACpBA,EAAMU,kBACNV,EAAMW,iBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAAQM,UAQfN,EAAQO,cACDtB,KAAKW,0BAA0BI,EAAQO,eAE3C,IACX,GDnDgBxB,OAAQ,IAT5B,MACI,WAAAD,CAAYE,GACRC,KAAKD,SAAWA,CACpB,CACA,KAAAa,CAAMT,GACF,MAAMoB,EAAW,CAAEC,EAAGrB,EAAMsB,QAASC,EAAGvB,EAAMwB,SAC9C3B,KAAKD,SAASa,MAAMgB,KAAKC,UAAUN,GACvC,GAEoDzB,OAAOgC,U","sources":["webpack://readium-js/./src/index-prepaginated-injectable.ts","webpack://readium-js/./src/common/gestures.ts"],"sourcesContent":["import { GesturesManager } from \"./common/gestures\";\nclass AdapterGesturesListener {\n constructor(listener) {\n this.listener = listener;\n }\n onTap(event) {\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.listener.onTap(JSON.stringify(tapEvent));\n }\n}\nnew GesturesManager(window, new AdapterGesturesListener(window.gestures));\n","export class GesturesManager {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n window.addEventListener(\"DOMContentLoaded\", () => {\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n });\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n"],"names":["constructor","window","listener","this","addEventListener","document","event","onClick","defaultPrevented","selection","getSelection","type","target","Element","nearestInteractiveElement","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","tapEvent","x","clientX","y","clientY","JSON","stringify","gestures"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js deleted file mode 100644 index 3f81f03ce9..0000000000 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(){"use strict";class t{constructor(t,i){if(this.margins={top:0,right:0,bottom:0,left:0},!t.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=t,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const i=this.parsePageSize(t);i&&(this.iframe.style.width=i.width+"px",this.iframe.style.height=i.height+"px",this.size=i,this.listener.onIframeLoaded())}parsePageSize(t){const i=/(\w+) *= *([^\s,]+)/g,e=new Map;let s;for(;s=i.exec(t.content);)null!=s&&e.set(s[1],s[2]);const h=parseFloat(e.get("width")),n=parseFloat(e.get("height"));return h&&n?{width:h,height:n}:void 0}}class i{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class e{constructor(i,e){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.metaViewport=e;const s={onIframeLoaded:()=>{this.onIframeLoaded()}};this.page=new t(i,s)}setViewport(t,i){this.viewport==t&&this.insets==i||(this.viewport=t,this.insets=i,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const e={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,i,e){switch(t){case"contain":return function(t,i){const e=i.width/t.width,s=i.height/t.height;return Math.min(e,s)}(i,e);case"width":return function(t,i){return i.width/t.width}(i,e);case"height":return function(t,i){return i.height/t.height}(i,e)}}(this.fit,this.page.size,e);this.metaViewport.content=(new i).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.page.show()}}var s;!function(t){const i=document.getElementById("page"),s=document.querySelector("meta[name=viewport]"),h=new e(i,s);t.loadResource=function(t){h.loadResource(t)},t.setViewport=function(t,i,e,s,n,a){const o={width:t,height:i},r={top:e,left:a,bottom:n,right:s};h.setViewport(o,r)},t.setFit=function(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);h.setFit(t)}}(s||(s={})),Window.prototype.layout=s}(); -//# sourceMappingURL=prepaginated-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map deleted file mode 100644 index ba21ab4111..0000000000 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/prepaginated-single-script.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"prepaginated-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/prepaginated/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/prepaginated/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/index-prepaginated-single.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.listener.onIframeLoaded();\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nexport class SingleAreaManager {\n constructor(iframe, metaViewport) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.metaViewport = metaViewport;\n const listener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n };\n this.page = new PageManager(iframe, listener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","//\n// Copyright 2021 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { SingleAreaManager } from \"./prepaginated/single-area-manager\";\n// Script used for the single spread wrapper HTML page for fixed layout resources.\n/*class WebListener implements SingleAreaManager.Listener{\n\n onError(error: SingleAreaManager.Error): void {\n console.error(error);\n }\n}\n\n//declare let listener: FixedPageManager.Listener\nconst listener = new WebListener();*/\nvar Layout;\n(function (Layout) {\n const iframe = document.getElementById(\"page\");\n const metaViewport = document.querySelector(\"meta[name=viewport]\");\n const manager = new SingleAreaManager(iframe, metaViewport);\n function loadResource(url) {\n manager.loadResource(url);\n }\n Layout.loadResource = loadResource;\n function setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n manager.setViewport(viewport, insets);\n }\n Layout.setViewport = setViewport;\n function setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n manager.setFit(fit);\n }\n Layout.setFit = setFit;\n})(Layout || (Layout = {}));\nWindow.prototype.layout = Layout;\n"],"names":["PageManager","constructor","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","SingleAreaManager","metaViewport","fit","insets","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","Layout","getElementById","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","Window","prototype"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt index 683da04030..0b61040a63 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt @@ -14,8 +14,8 @@ import org.readium.navigator.web.preferences.FixedWebDefaults import org.readium.navigator.web.preferences.FixedWebPreferences import org.readium.navigator.web.preferences.FixedWebPreferencesEditor import org.readium.navigator.web.util.WebViewServer -import org.readium.navigator.web.webapi.PrepaginatedDoubleApi -import org.readium.navigator.web.webapi.PrepaginatedSingleApi +import org.readium.navigator.web.webapi.FixedDoubleApi +import org.readium.navigator.web.webapi.FixedSingleApi import org.readium.r2.navigator.extensions.normalizeLocator import org.readium.r2.shared.DelicateReadiumApi import org.readium.r2.shared.ExperimentalReadiumApi @@ -119,12 +119,12 @@ public class FixedWebNavigatorFactory private constructor( try { val assetsUrl = WebViewServer.assetUrl("readium/navigators/web")!! - val prepaginatedSingleContent = PrepaginatedSingleApi.getPageContent( + val prepaginatedSingleContent = FixedSingleApi.getPageContent( assetManager = application.assets, assetsUrl = assetsUrl ) - val prepaginatedDoubleContent = PrepaginatedDoubleApi.getPageContent( + val prepaginatedDoubleContent = FixedDoubleApi.getPageContent( assetManager = application.assets, assetsUrl = assetsUrl ) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt index 18130f6dd2..f9af0e5aa2 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt @@ -16,7 +16,7 @@ import kotlinx.coroutines.flow.onEach import org.readium.navigator.web.layout.DoubleViewportSpread import org.readium.navigator.web.util.DisplayArea import org.readium.navigator.web.util.WebViewClient -import org.readium.navigator.web.webapi.PrepaginatedDoubleApi +import org.readium.navigator.web.webapi.FixedDoubleApi import org.readium.navigator.web.webview.LoadingState import org.readium.navigator.web.webview.rememberWebViewStateWithHTMLData import org.readium.r2.navigator.input.TapEvent @@ -43,7 +43,7 @@ internal fun DoubleViewportSpread( webViewState.webView ?.takeIf { webViewState.loadingState is LoadingState.Finished } ?.let { - PrepaginatedDoubleApi(it) + FixedDoubleApi(it) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt index ce9660d010..ba8ac6aec3 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt @@ -16,7 +16,7 @@ import kotlinx.coroutines.flow.onEach import org.readium.navigator.web.layout.SingleViewportSpread import org.readium.navigator.web.util.DisplayArea import org.readium.navigator.web.util.WebViewClient -import org.readium.navigator.web.webapi.PrepaginatedSingleApi +import org.readium.navigator.web.webapi.FixedSingleApi import org.readium.navigator.web.webview.LoadingState import org.readium.navigator.web.webview.rememberWebViewStateWithHTMLData import org.readium.r2.navigator.input.TapEvent @@ -43,7 +43,7 @@ internal fun SingleViewportSpread( webViewState.webView ?.takeIf { webViewState.loadingState is LoadingState.Finished } ?.let { - PrepaginatedSingleApi(it) + FixedSingleApi(it) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/FixedDoubleApi.kt similarity index 84% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/FixedDoubleApi.kt index 755585f98f..8bee38bf12 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedDoubleApi.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/FixedDoubleApi.kt @@ -12,7 +12,7 @@ import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl @OptIn(ExperimentalReadiumApi::class) -internal class PrepaginatedDoubleApi( +internal class FixedDoubleApi( private val webView: WebView ) { @@ -20,7 +20,7 @@ internal class PrepaginatedDoubleApi( suspend fun getPageContent(assetManager: AssetManager, assetsUrl: AbsoluteUrl): String = withContext(Dispatchers.IO) { - assetManager.open("readium/navigators/web/prepaginated-double-index.html") + assetManager.open("readium/navigators/web/fixed-double-index.html") .bufferedReader() .use { it.readText() } .replace("{{ASSETS_URL}}", assetsUrl.toString()) @@ -34,7 +34,7 @@ internal class PrepaginatedDoubleApi( leftUrl?.let { add("left: `$it`") } rightUrl?.let { add("right: `$it`") } }.joinToString(separator = ", ", prefix = "{ ", postfix = " }") - webView.evaluateJavascript("layout.loadSpread($argument);") {} + webView.evaluateJavascript("doubleArea.loadSpread($argument);") {} } fun setDisplayArea(displayArea: DisplayArea) { @@ -43,12 +43,12 @@ internal class PrepaginatedDoubleApi( val right = displayArea.safeDrawingPadding.right val bottom = displayArea.safeDrawingPadding.bottom val left = displayArea.safeDrawingPadding.left - val script = "layout.setViewport($width, $height, $top, $right, $bottom, $left);" + val script = "doubleArea.setViewport($width, $height, $top, $right, $bottom, $left);" webView.evaluateJavascript(script) {} } fun setFit(fit: Fit) { - val script = "layout.setFit(`${fit.value}`);" + val script = "doubleArea.setFit(`${fit.value}`);" webView.evaluateJavascript(script) {} } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/FixedSingleApi.kt similarity index 82% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/FixedSingleApi.kt index 4299d14a69..fbfe14281c 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/PrepaginatedSingleApi.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/FixedSingleApi.kt @@ -12,7 +12,7 @@ import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl @OptIn(ExperimentalReadiumApi::class) -internal class PrepaginatedSingleApi( +internal class FixedSingleApi( private val webView: WebView ) { @@ -20,7 +20,7 @@ internal class PrepaginatedSingleApi( suspend fun getPageContent(assetManager: AssetManager, assetsUrl: AbsoluteUrl): String = withContext(Dispatchers.IO) { - assetManager.open("readium/navigators/web/prepaginated-single-index.html") + assetManager.open("readium/navigators/web/fixed-single-index.html") .bufferedReader() .use { it.readText() } .replace("{{ASSETS_URL}}", assetsUrl.toString()) @@ -29,7 +29,7 @@ internal class PrepaginatedSingleApi( fun loadSpread(spread: SingleViewportSpread) { val resourceUrl = WebViewServer.publicationBaseHref.resolve(spread.page.href) - val script = "layout.loadResource(`$resourceUrl`);" + val script = "singleArea.loadResource(`$resourceUrl`);" webView.evaluateJavascript(script) {} } @@ -39,12 +39,12 @@ internal class PrepaginatedSingleApi( val right = displayArea.safeDrawingPadding.right val bottom = displayArea.safeDrawingPadding.bottom val left = displayArea.safeDrawingPadding.left - val script = "layout.setViewport($width, $height, $top, $right, $bottom, $left);" + val script = "singleArea.setViewport($width, $height, $top, $right, $bottom, $left);" webView.evaluateJavascript(script) {} } fun setFit(fit: Fit) { - val script = "layout.setFit(`${fit.value}`);" + val script = "singleArea.setFit(`${fit.value}`);" webView.evaluateJavascript(script) {} } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/GesturesApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/GesturesApi.kt index 4a6db9b719..55b54891ab 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/GesturesApi.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/GesturesApi.kt @@ -3,9 +3,11 @@ package org.readium.navigator.web.webapi import android.graphics.PointF import android.webkit.WebView import androidx.compose.ui.unit.Density +import androidx.compose.ui.unit.dp import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import org.readium.r2.shared.util.RelativeUrl +import timber.log.Timber internal interface GesturesListener { @@ -20,7 +22,7 @@ internal class GesturesApi( companion object { val path: RelativeUrl = - RelativeUrl("readium/navigators/web/prepaginated-injectable-script.js")!! + RelativeUrl("readium/navigators/web/fixed-injectable-script.js")!! } fun registerOnWebView(webView: WebView) { @@ -29,8 +31,10 @@ internal class GesturesApi( @android.webkit.JavascriptInterface fun onTap(eventJson: String) { + Timber.d("onTap start $eventJson") val tapEvent = Json.decodeFromString(eventJson) - val point = with(density) { PointF(tapEvent.x.toDp().value, tapEvent.y.toDp().value) } + val point = with(density) { PointF(tapEvent.x.dp.toPx(), tapEvent.y.dp.toPx()) } + Timber.d("onTap ${point.x} ${point.y}") listener.onTap(point) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt index e5e674092d..4d56f554fe 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt @@ -35,6 +35,7 @@ import org.readium.navigator.web.gestures.Fling2DBehavior import org.readium.navigator.web.gestures.scrollable2D import org.readium.navigator.web.webview.LoadingState.Finished import org.readium.navigator.web.webview.LoadingState.Loading +import timber.log.Timber /** * A wrapper around the Android View WebView to provide a basic WebView composable. @@ -93,6 +94,8 @@ internal fun WebView( height ) + Timber.d("constraints ${constraints.maxWidth} ${constraints.maxHeight}") + LazyRow( horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically, From a8a87e43c7684bf17a426b3848c5c5bac82c0433 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Mon, 21 Oct 2024 16:30:46 +0200 Subject: [PATCH 45/61] Fix navigation --- .../web/scripts/dist/fixed-double-script.js | 2 +- .../scripts/dist/fixed-double-script.js.map | 2 +- .../scripts/dist/fixed-injectable-script.js | 2 +- .../dist/fixed-injectable-script.js.map | 2 +- .../web/scripts/dist/fixed-single-script.js | 2 +- .../scripts/dist/fixed-single-script.js.map | 2 +- .../src/bridge/fixed-gestures-bridge.ts | 5 ++++ .../web/scripts/src/common/gestures.ts | 27 ++++++++++++------- .../web/scripts/src/fixed/area-manager.ts | 1 + .../scripts/src/fixed/double-area-manager.ts | 7 +++++ .../web/scripts/src/fixed/page-manager.ts | 3 +++ .../scripts/src/fixed/single-area-manager.ts | 7 +++++ .../web/scripts/src/index-fixed-injectable.ts | 4 +++ .../navigators/web/fixed-double-script.js | 2 +- .../navigators/web/fixed-double-script.js.map | 2 +- .../navigators/web/fixed-injectable-script.js | 2 +- .../web/fixed-injectable-script.js.map | 2 +- .../navigators/web/fixed-single-script.js | 2 +- .../navigators/web/fixed-single-script.js.map | 2 +- .../navigator/web/FixedWebNavigator.kt | 7 ++++- .../navigator/web/FixedWebNavigatorState.kt | 14 +++++++++- .../navigator/web/layout/ReadingOrder.kt | 8 +++++- .../web/spread/DoubleViewportSpread.kt | 3 +++ .../web/spread/SingleViewportSpread.kt | 3 +++ .../navigator/web/spread/SpreadWebView.kt | 6 +++++ .../navigator/web/webapi/GesturesApi.kt | 8 ++++++ 26 files changed, 102 insertions(+), 25 deletions(-) diff --git a/readium/navigators/web/scripts/dist/fixed-double-script.js b/readium/navigators/web/scripts/dist/fixed-double-script.js index 27bb8eb5ea..36cdcac9b7 100644 --- a/readium/navigators/web/scripts/dist/fixed-double-script.js +++ b/readium/navigators/web/scripts/dist/fixed-double-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{console.log(`onmessage ${t}`),this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y&&this.listener.onTap({x:t.data.x,y:t.data.y})}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const h=parseFloat(i.get("width")),n=parseFloat(i.get("height"));return h&&n?{width:h,height:n}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){console.log(`Constructing Gesturesdetector for window ${t}`),this.window=t,this.listener=e,document.addEventListener("click",(t=>{console.log("onClick"),this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();e&&"Range"==e.type||t.target instanceof Element&&this.nearestInteractiveElement(t.target)||(console.log("tap detected"),this.listener.onTap(t),t.stopPropagation(),t.preventDefault())}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t.outerHTML:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,h,n,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},new i(e,{onTap:t=>{a.onTap({x:t.clientX,y:t.clientY})}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{a.onTap(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,h,o),this.metaViewport=n}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),n={width:s,height:h},a={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,n,a);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}class h{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}}const n=document.getElementById("page-left"),a=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,n,a){const o=new h(a);this.manager=new s(t,e,i,n,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,h,n){const a={width:t,height:e},o={top:i,left:n,bottom:h,right:s};this.manager.setViewport(a,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,n,a,o,window.gestures)}(); +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{console.log(`onmessage ${t}`),this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y?this.listener.onTap({x:t.data.x,y:t.data.y}):t.data.href&&this.listener.onLinkActivated(t.data.href)}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),h=parseFloat(i.get("height"));return n&&h?{width:n,height:h}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){console.log(`Constructing Gesturesdetector for window ${t}`),this.window=t,this.listener=e,document.addEventListener("click",(t=>{console.log("onClick"),this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):(console.log("tap detected"),this.listener.onTap(t)),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,h,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},new i(e,{onTap:t=>{a.onTap({x:t.clientX,y:t.clientY})},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{a.onTap(t)},onLinkActivated:t=>{a.onLinkActivated(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,n,o),this.metaViewport=h}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,n=Math.max(this.leftPage.size.height,this.rightPage.size.height),h={width:s,height:n},a={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,h,a);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(n).build(),this.leftPage.show(),this.rightPage.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const h=document.getElementById("page-left"),a=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,h,a){const o=new n(a);this.manager=new s(t,e,i,h,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,n,h){const a={width:t,height:e},o={top:i,left:h,bottom:n,right:s};this.manager.setViewport(a,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,h,a,o,window.gestures)}(); //# sourceMappingURL=fixed-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-double-script.js.map b/readium/navigators/web/scripts/dist/fixed-double-script.js.map index 10fb36ad65..2f60361fe2 100644 --- a/readium/navigators/web/scripts/dist/fixed-double-script.js.map +++ b/readium/navigators/web/scripts/dist/fixed-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n console.log(`onmessage ${message}`);\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n console.log(\"tap detected\");\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const wrapperGesturesListener = {\n onTap: (event) => {\n listener.onTap({ x: event.clientX, y: event.clientY });\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const pageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n listener.onTap(event);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, pageListener);\n this.rightPage = new PageManager(window, rightIframe, pageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","console","log","onMessageFromIframe","postMessage","port2","data","x","y","onTap","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","target","Element","nearestInteractiveElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","clientX","clientY","pageListener","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-double-script.js","mappings":"yBACO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,EAAQC,GAGxB,GAFAC,KAAKC,QAAU,CAAEC,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GACpDL,KAAKM,QAAU,IAAIC,gBACdT,EAAOU,cACR,MAAMC,MAAM,mDAEhBT,KAAKD,SAAWA,EAChBC,KAAKF,OAASA,EACdE,KAAKF,OAAOY,iBAAiB,QAAQ,KACjCV,KAAKW,gBAAgB,GAE7B,CACA,IAAAC,GACIZ,KAAKF,OAAOe,MAAMC,QAAU,OAChC,CACA,IAAAC,GACIf,KAAKF,OAAOe,MAAMC,QAAU,MAChC,CAEA,UAAAE,CAAWf,GACHD,KAAKC,SAAWA,IAGpBD,KAAKF,OAAOe,MAAMI,UAAYjB,KAAKC,QAAQC,IAAM,KACjDF,KAAKF,OAAOe,MAAMK,WAAalB,KAAKC,QAAQI,KAAO,KACnDL,KAAKF,OAAOe,MAAMM,aAAenB,KAAKC,QAAQG,OAAS,KACvDJ,KAAKF,OAAOe,MAAMO,YAAcpB,KAAKC,QAAQE,MAAQ,KACzD,CAEA,QAAAkB,CAASC,GACLtB,KAAKF,OAAOyB,IAAMD,CACtB,CAEA,cAAAE,CAAeC,GACXzB,KAAKF,OAAOe,MAAMa,MAAQD,EAAKC,MAAQ,KACvC1B,KAAKF,OAAOe,MAAMc,OAASF,EAAKE,OAAS,KACzC3B,KAAKyB,KAAOA,CAChB,CACA,cAAAd,GACI,MAAMiB,EAAW5B,KAAKF,OAAOU,cAAcqB,SAASC,cAAc,uBAClE,IAAKF,GAAYA,aAAoBG,gBAEjC,OAEJ,MAAMC,EAAWhC,KAAKiC,cAAcL,GAC/BI,IAILhC,KAAKF,OAAOe,MAAMa,MAAQM,EAASN,MAAQ,KAC3C1B,KAAKF,OAAOe,MAAMc,OAASK,EAASL,OAAS,KAC7C3B,KAAKyB,KAAOO,EACZhC,KAAKM,QAAQ4B,MAAMC,UAAaC,IAC5BC,QAAQC,IAAI,aAAaF,KACzBpC,KAAKuC,oBAAoBH,EAAQ,EAErCpC,KAAKF,OAAOU,cAAcgC,YAAY,OAAQ,IAAK,CAACxC,KAAKM,QAAQmC,QACjEzC,KAAKD,SAASY,iBAClB,CACA,mBAAA4B,CAAoBH,GACZA,EAAQM,KAAKC,GAAKP,EAAQM,KAAKE,EAC/B5C,KAAKD,SAAS8C,MAAM,CAAEF,EAAGP,EAAQM,KAAKC,EAAGC,EAAGR,EAAQM,KAAKE,IAEpDR,EAAQM,KAAKI,MAClB9C,KAAKD,SAASgD,gBAAgBX,EAAQM,KAAKI,KAEnD,CAEA,aAAAb,CAAce,GACV,MAAMC,EAAQ,uBACRC,EAAa,IAAIC,IACvB,IAAIC,EACJ,KAAQA,EAAQH,EAAMI,KAAKL,EAAaM,UACvB,MAATF,GACAF,EAAWK,IAAIH,EAAM,GAAIA,EAAM,IAGvC,MAAM1B,EAAQ8B,WAAWN,EAAWO,IAAI,UAClC9B,EAAS6B,WAAWN,EAAWO,IAAI,WACzC,OAAI/B,GAASC,EACF,CAAED,QAAOC,eAGhB,CAER,ECvFG,MAAM+B,EACT,eAAAC,CAAgBC,GAEZ,OADA5D,KAAK6D,aAAeD,EACb5D,IACX,CACA,eAAA8D,CAAgBF,GAEZ,OADA5D,KAAK+D,aAAeH,EACb5D,IACX,CACA,QAAAgE,CAAStC,GAEL,OADA1B,KAAK0B,MAAQA,EACN1B,IACX,CACA,SAAAiE,CAAUtC,GAEN,OADA3B,KAAK2B,OAASA,EACP3B,IACX,CACA,KAAAkE,GACI,MAAMC,EAAa,GAanB,OAZInE,KAAK6D,cACLM,EAAWC,KAAK,iBAAmBpE,KAAK6D,cAExC7D,KAAK+D,cACLI,EAAWC,KAAK,iBAAmBpE,KAAK+D,cAExC/D,KAAK0B,OACLyC,EAAWC,KAAK,SAAWpE,KAAK0B,OAEhC1B,KAAK2B,QACLwC,EAAWC,KAAK,UAAYpE,KAAK2B,QAE9BwC,EAAWE,KAAK,KAC3B,EChCG,MAAMC,EACT,WAAA1E,CAAYC,EAAQE,GAChBsC,QAAQC,IAAI,4CAA4CzC,KACxDG,KAAKH,OAASA,EACdG,KAAKD,SAAWA,EAChB8B,SAASnB,iBAAiB,SAAU6D,IAChClC,QAAQC,IAAI,WACZtC,KAAKwE,QAAQD,EAAM,IACpB,EAIP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAY1E,KAAKH,OAAO8E,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAN,EAAMO,kBAAkBC,YACP/E,KAAKgF,0BAA0BT,EAAMO,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1BjF,KAAKD,SAASgD,gBAAgB8B,EAAe/B,OAIjDT,QAAQC,IAAI,gBACZtC,KAAKD,SAAS8C,MAAM0B,IAExBA,EAAMW,kBACNX,EAAMY,gBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACD1F,KAAKgF,0BAA0BI,EAAQM,eAE3C,IACX,ECvEG,MAAMC,EACT,WAAA/F,CAAYC,EAAQ+F,EAAYC,EAAaC,EAAc/F,GACvDC,KAAK+F,IAAM,UACX/F,KAAKgG,OAAS,CAAE9F,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GAUnD,IAAIiE,EAAiBzE,EATW,CAC5BgD,MAAQ0B,IACJxE,EAAS8C,MAAM,CAAEF,EAAG4B,EAAM0B,QAASrD,EAAG2B,EAAM2B,SAAU,EAG1DnD,gBAAkBoD,IACd,MAAM1F,MAAM,+CAA+C,IAInE,MAAM2F,EAAe,CACjBzF,eAAgB,KACZX,KAAKqG,QAAQ,EAEjBxD,MAAQ0B,IACJxE,EAAS8C,MAAM0B,EAAM,EAEzBxB,gBAAkBD,IACd/C,EAASgD,gBAAgBD,EAAK,GAGtC9C,KAAKsG,SAAW,IAAI3G,EAAYE,EAAQ+F,EAAYQ,GACpDpG,KAAKuG,UAAY,IAAI5G,EAAYE,EAAQgG,EAAaO,GACtDpG,KAAK8F,aAAeA,CACxB,CACA,UAAAU,CAAWC,GACPzG,KAAKsG,SAASvF,OACdf,KAAKuG,UAAUxF,OACff,KAAKyG,OAASA,EACVA,EAAOpG,MACPL,KAAKsG,SAASjF,SAASoF,EAAOpG,MAE9BoG,EAAOtG,OACPH,KAAKuG,UAAUlF,SAASoF,EAAOtG,MAEvC,CACA,WAAAuG,CAAYjF,EAAMuE,GACVhG,KAAK4B,UAAYH,GAAQzB,KAAKgG,QAAUA,IAG5ChG,KAAK4B,SAAWH,EAChBzB,KAAKgG,OAASA,EACdhG,KAAKqG,SACT,CACA,MAAAM,CAAOZ,GACC/F,KAAK+F,KAAOA,IAGhB/F,KAAK+F,IAAMA,EACX/F,KAAKqG,SACT,CACA,MAAAA,GACI,IAAKrG,KAAK4B,WACJ5B,KAAKsG,SAAS7E,MAAQzB,KAAKyG,OAAOpG,OAClCL,KAAKuG,UAAU9E,MAAQzB,KAAKyG,OAAOtG,MACrC,OAEJ,MAAMyG,EAAc,CAChB1G,IAAKF,KAAKgG,OAAO9F,IACjBC,MAAO,EACPC,OAAQJ,KAAKgG,OAAO5F,OACpBC,KAAML,KAAKgG,OAAO3F,MAEtBL,KAAKsG,SAAStF,WAAW4F,GACzB,MAAMC,EAAe,CACjB3G,IAAKF,KAAKgG,OAAO9F,IACjBC,MAAOH,KAAKgG,OAAO7F,MACnBC,OAAQJ,KAAKgG,OAAO5F,OACpBC,KAAM,GAEVL,KAAKuG,UAAUvF,WAAW6F,GACrB7G,KAAKyG,OAAOtG,MAGPH,KAAKyG,OAAOpG,MAClBL,KAAKsG,SAAS9E,eAAexB,KAAKuG,UAAU9E,MAH5CzB,KAAKuG,UAAU/E,eAAexB,KAAKsG,SAAS7E,MAKhD,MAAMqF,EAAe9G,KAAKsG,SAAS7E,KAAKC,MAAQ1B,KAAKuG,UAAU9E,KAAKC,MAC9DqF,EAAgBC,KAAKC,IAAIjH,KAAKsG,SAAS7E,KAAKE,OAAQ3B,KAAKuG,UAAU9E,KAAKE,QACxEuF,EAAc,CAAExF,MAAOoF,EAAcnF,OAAQoF,GAC7CI,EAAkB,CACpBzF,MAAO1B,KAAK4B,SAASF,MAAQ1B,KAAKgG,OAAO3F,KAAOL,KAAKgG,OAAO7F,MAC5DwB,OAAQ3B,KAAK4B,SAASD,OAAS3B,KAAKgG,OAAO9F,IAAMF,KAAKgG,OAAO5F,QAE3DwD,EC5FP,SAAsBmC,EAAKzC,EAAS8D,GACvC,OAAQrB,GACJ,IAAK,UACD,OAOZ,SAAoBzC,EAAS8D,GACzB,MAAMC,EAAaD,EAAU1F,MAAQ4B,EAAQ5B,MACvC4F,EAAcF,EAAUzF,OAAS2B,EAAQ3B,OAC/C,OAAOqF,KAAKO,IAAIF,EAAYC,EAChC,CAXmBE,CAAWlE,EAAS8D,GAC/B,IAAK,QACD,OAUZ,SAAkB9D,EAAS8D,GACvB,OAAOA,EAAU1F,MAAQ4B,EAAQ5B,KACrC,CAZmB+F,CAASnE,EAAS8D,GAC7B,IAAK,SACD,OAWZ,SAAmB9D,EAAS8D,GACxB,OAAOA,EAAUzF,OAAS2B,EAAQ3B,MACtC,CAbmB+F,CAAUpE,EAAS8D,GAEtC,CDmFsBO,CAAa3H,KAAK+F,IAAKmB,EAAaC,GAClDnH,KAAK8F,aAAaxC,SAAU,IAAII,GAC3BC,gBAAgBC,GAChBE,gBAAgBF,GAChBI,SAAS8C,GACT7C,UAAU8C,GACV7C,QACLlE,KAAKsG,SAAS1F,OACdZ,KAAKuG,UAAU3F,MACnB,EErGG,MAAMgH,EACT,WAAAhI,CAAYiI,GACR7H,KAAK8H,UAAYD,CACrB,CACA,KAAAhF,CAAM0B,GACFvE,KAAK8H,UAAUjF,MAAMkF,KAAKC,UAAUzD,GACxC,CACA,eAAAxB,CAAgBD,GACZ9C,KAAK8H,UAAU/E,gBAAgBD,EACnC,ECHJ,MAAM8C,EAAa/D,SAASoG,eAAe,aACrCpC,EAAchE,SAASoG,eAAe,cACtCnC,EAAejE,SAASC,cAAc,uBAC5CoG,OAAOC,UAAUC,WAAa,ICPvB,MACH,WAAAxI,CAAYC,EAAQ+F,EAAYC,EAAaC,EAAcuC,GACvD,MAAMtI,EAAW,IAAI6H,EAAsBS,GAC3CrI,KAAKsI,QAAU,IAAI3C,EAAkB9F,EAAQ+F,EAAYC,EAAaC,EAAc/F,EACxF,CACA,UAAAyG,CAAWC,GACPzG,KAAKsI,QAAQ9B,WAAWC,EAC5B,CACA,WAAAC,CAAY6B,EAAgBC,EAAgBC,EAAUC,EAAYC,EAAaC,GAC3E,MAAMhH,EAAW,CAAEF,MAAO6G,EAAgB5G,OAAQ6G,GAC5CxC,EAAS,CACX9F,IAAKuI,EACLpI,KAAMuI,EACNxI,OAAQuI,EACRxI,MAAOuI,GAEX1I,KAAKsI,QAAQ5B,YAAY9E,EAAUoE,EACvC,CACA,MAAAW,CAAOZ,GACH,GAAW,WAAPA,GAA2B,SAAPA,GAAyB,UAAPA,EACtC,MAAMtF,MAAM,sBAAsBsF,KAEtC/F,KAAKsI,QAAQ3B,OAAOZ,EACxB,GDhBgDlG,OAAQ+F,EAAYC,EAAaC,EAAcjG,OAAOwI,S","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n console.log(`onmessage ${message}`);\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n else if (message.data.href) {\n this.listener.onLinkActivated(message.data.href);\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n console.log(\"tap detected\");\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const wrapperGesturesListener = {\n onTap: (event) => {\n listener.onTap({ x: event.clientX, y: event.clientY });\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const pageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n listener.onTap(event);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, pageListener);\n this.rightPage = new PageManager(window, rightIframe, pageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","console","log","onMessageFromIframe","postMessage","port2","data","x","y","onTap","href","onLinkActivated","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","clientX","clientY","_","pageListener","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-injectable-script.js b/readium/navigators/web/scripts/dist/fixed-injectable-script.js index e663803c00..cf62076439 100644 --- a/readium/navigators/web/scripts/dist/fixed-injectable-script.js +++ b/readium/navigators/web/scripts/dist/fixed-injectable-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class e{constructor(e,t){console.log(`Constructing Gesturesdetector for window ${e}`),this.window=e,this.listener=t,document.addEventListener("click",(e=>{console.log("onClick"),this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();t&&"Range"==t.type||e.target instanceof Element&&this.nearestInteractiveElement(e.target)||(console.log("tap detected"),this.listener.onTap(e),e.stopPropagation(),e.preventDefault())}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e.outerHTML:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}window.addEventListener("message",(n=>{if(n.ports[0]){console.log("receiving port");const o=n.ports[0],s=new t(o);new e(window,s)}}));class t{constructor(e){this.messagePort=e}onTap(e){console.log("posting event");const t={x:e.clientX,y:e.clientY};this.messagePort.postMessage(t)}}}(); +!function(){"use strict";class e{constructor(e,t){console.log(`Constructing Gesturesdetector for window ${e}`),this.window=e,this.listener=t,document.addEventListener("click",(e=>{console.log("onClick"),this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();if(t&&"Range"==t.type)return;let n;n=e.target instanceof HTMLElement?this.nearestInteractiveElement(e.target):null,n?n instanceof HTMLAnchorElement&&this.listener.onLinkActivated(n.href):(console.log("tap detected"),this.listener.onTap(e)),e.stopPropagation(),e.preventDefault()}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}window.addEventListener("message",(n=>{if(n.ports[0]){console.log("receiving port");const o=n.ports[0],s=new t(o);new e(window,s)}}));class t{constructor(e){this.messagePort=e}onTap(e){console.log("posting event");const t={x:e.clientX,y:e.clientY};this.messagePort.postMessage(t)}onLinkActivated(e){this.messagePort.postMessage({href:e})}}}(); //# sourceMappingURL=fixed-injectable-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map b/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map index 22c6008e17..016031e632 100644 --- a/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map +++ b/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAAO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAChBC,QAAQC,IAAI,4CAA4CH,KACxDI,KAAKJ,OAASA,EACdI,KAAKH,SAAWA,EAChBI,SAASC,iBAAiB,SAAUC,IAChCL,QAAQC,IAAI,WACZC,KAAKI,QAAQD,EAAM,IACpB,EAIP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKJ,OAAOW,eAC1BD,GAA+B,SAAlBA,EAAUE,MAMvBL,EAAMM,kBAAkBC,SACxBV,KAAKW,0BAA0BR,EAAMM,UAGzCX,QAAQC,IAAI,gBACZC,KAAKH,SAASe,MAAMT,GACpBA,EAAMU,kBACNV,EAAMW,iBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAAQM,UAQfN,EAAQO,cACDtB,KAAKW,0BAA0BI,EAAQO,eAE3C,IACX,ECxDJ1B,OAAOM,iBAAiB,WAAYC,IAChC,GAAIA,EAAMoB,MAAM,GAAI,CAChBzB,QAAQC,IAAI,kBACZ,MAAMyB,EAAcrB,EAAMoB,MAAM,GAC1BE,EAAoB,IAAIC,EAA0BF,GACxD,IAAI9B,EAAiBE,OAAQ6B,EACjC,KAEJ,MAAMC,EACF,WAAA/B,CAAY6B,GACRxB,KAAKwB,YAAcA,CACvB,CACA,KAAAZ,CAAMT,GACFL,QAAQC,IAAI,iBACZ,MAAM4B,EAAW,CAAEC,EAAGzB,EAAM0B,QAASC,EAAG3B,EAAM4B,SAC9C/B,KAAKwB,YAAYQ,YAAYL,EACjC,E","sources":["webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/index-fixed-injectable.ts"],"sourcesContent":["export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n console.log(\"tap detected\");\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nwindow.addEventListener(\"message\", (event) => {\n if (event.ports[0]) {\n console.log(\"receiving port\");\n const messagePort = event.ports[0];\n const messagingListener = new MessagingGesturesListener(messagePort);\n new GesturesDetector(window, messagingListener);\n }\n});\nclass MessagingGesturesListener {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n onTap(event) {\n console.log(\"posting event\");\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.messagePort.postMessage(tapEvent);\n }\n}\n"],"names":["GesturesDetector","constructor","window","listener","console","log","this","document","addEventListener","event","onClick","defaultPrevented","selection","getSelection","type","target","Element","nearestInteractiveElement","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","ports","messagePort","messagingListener","MessagingGesturesListener","tapEvent","x","clientX","y","clientY","postMessage"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAAO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAChBC,QAAQC,IAAI,4CAA4CH,KACxDI,KAAKJ,OAASA,EACdI,KAAKH,SAAWA,EAChBI,SAASC,iBAAiB,SAAUC,IAChCL,QAAQC,IAAI,WACZC,KAAKI,QAAQD,EAAM,IACpB,EAIP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKJ,OAAOW,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAN,EAAMO,kBAAkBC,YACPX,KAAKY,0BAA0BT,EAAMO,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1Bb,KAAKH,SAASiB,gBAAgBL,EAAeM,OAIjDjB,QAAQC,IAAI,gBACZC,KAAKH,SAASmB,MAAMb,IAExBA,EAAMc,kBACNd,EAAMe,gBACV,CAEA,yBAAAN,CAA0BO,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACDzB,KAAKY,0BAA0BO,EAAQM,eAE3C,IACX,EClEJ7B,OAAOM,iBAAiB,WAAYC,IAChC,GAAIA,EAAMuB,MAAM,GAAI,CAChB5B,QAAQC,IAAI,kBACZ,MAAM4B,EAAcxB,EAAMuB,MAAM,GAC1BE,EAAoB,IAAIC,EAA0BF,GACxD,IAAIjC,EAAiBE,OAAQgC,EACjC,KAEJ,MAAMC,EACF,WAAAlC,CAAYgC,GACR3B,KAAK2B,YAAcA,CACvB,CACA,KAAAX,CAAMb,GACFL,QAAQC,IAAI,iBACZ,MAAM+B,EAAW,CAAEC,EAAG5B,EAAM6B,QAASC,EAAG9B,EAAM+B,SAC9ClC,KAAK2B,YAAYQ,YAAYL,EACjC,CACA,eAAAhB,CAAgBC,GACZf,KAAK2B,YAAYQ,YAAY,CAAEpB,KAAMA,GACzC,E","sources":["webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/index-fixed-injectable.ts"],"sourcesContent":["export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n console.log(\"tap detected\");\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nwindow.addEventListener(\"message\", (event) => {\n if (event.ports[0]) {\n console.log(\"receiving port\");\n const messagePort = event.ports[0];\n const messagingListener = new MessagingGesturesListener(messagePort);\n new GesturesDetector(window, messagingListener);\n }\n});\nclass MessagingGesturesListener {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n onTap(event) {\n console.log(\"posting event\");\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.messagePort.postMessage(tapEvent);\n }\n onLinkActivated(href) {\n this.messagePort.postMessage({ href: href });\n }\n}\n"],"names":["GesturesDetector","constructor","window","listener","console","log","this","document","addEventListener","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","onLinkActivated","href","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","ports","messagePort","messagingListener","MessagingGesturesListener","tapEvent","x","clientX","y","clientY","postMessage"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-single-script.js b/readium/navigators/web/scripts/dist/fixed-single-script.js index 8a50ccd1de..8becbdf98f 100644 --- a/readium/navigators/web/scripts/dist/fixed-single-script.js +++ b/readium/navigators/web/scripts/dist/fixed-single-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{console.log(`onmessage ${t}`),this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y&&this.listener.onTap({x:t.data.x,y:t.data.y})}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),o=parseFloat(i.get("height"));return n&&o?{width:n,height:o}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){console.log(`Constructing Gesturesdetector for window ${t}`),this.window=t,this.listener=e,document.addEventListener("click",(t=>{console.log("onClick"),this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();e&&"Range"==e.type||t.target instanceof Element&&this.nearestInteractiveElement(t.target)||(console.log("tap detected"),this.listener.onTap(t),t.stopPropagation(),t.preventDefault())}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t.outerHTML:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,o){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,new i(e,{onTap:t=>{var i,s,a;console.log(`metaViewport ${n.content}`);const h=e.document.documentElement;console.log(`docElement ${h.scrollLeft} ${h.scrollTop}`),console.log(`scale ${null===(i=e.visualViewport)||void 0===i?void 0:i.scale}`),console.log(`visualviewport ${null===(s=e.visualViewport)||void 0===s?void 0:s.width} ${null===(a=e.visualViewport)||void 0===a?void 0:a.height}`);const l={x:t.clientX*this.scale/(e.visualViewport.scale*this.scale),y:t.clientY*this.scale/(e.visualViewport.scale*this.scale)};o.onTap(l)}}),this.metaViewport=n;const a={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{var i,n,a;const h=e.document.documentElement;console.log(`docElement ${h.scrollLeft} ${h.scrollTop}`),console.log(`scale ${null===(i=e.visualViewport)||void 0===i?void 0:i.scale}`),console.log(`visualviewport ${null===(n=e.visualViewport)||void 0===n?void 0:n.width} ${null===(a=e.visualViewport)||void 0===a?void 0:a.height}`);const l=s.getBoundingClientRect();console.log(`boundingRect $} ${l.left} ${l.top}`);const r={x:(t.x+l.left)*this.scale/(e.visualViewport.scale*this.scale),y:(t.y+l.top)*this.scale/(e.visualViewport.scale*this.scale)};o.onTap(r)}};this.page=new t(e,s,a)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}}const o=document.getElementById("page"),a=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,o){const a=new n(o);this.manager=new s(t,e,i,a)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,o){const a={width:t,height:e},h={top:i,left:o,bottom:n,right:s};this.manager.setViewport(a,h)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,o,a,window.gestures)}(); +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{console.log(`onmessage ${t}`),this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y?this.listener.onTap({x:t.data.x,y:t.data.y}):t.data.href&&this.listener.onLinkActivated(t.data.href)}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),o=parseFloat(i.get("height"));return n&&o?{width:n,height:o}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){console.log(`Constructing Gesturesdetector for window ${t}`),this.window=t,this.listener=e,document.addEventListener("click",(t=>{console.log("onClick"),this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):(console.log("tap detected"),this.listener.onTap(t)),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,o){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,new i(e,{onTap:t=>{var i,s,a;console.log(`metaViewport ${n.content}`);const h=e.document.documentElement;console.log(`docElement ${h.scrollLeft} ${h.scrollTop}`),console.log(`scale ${null===(i=e.visualViewport)||void 0===i?void 0:i.scale}`),console.log(`visualviewport ${null===(s=e.visualViewport)||void 0===s?void 0:s.width} ${null===(a=e.visualViewport)||void 0===a?void 0:a.height}`);const l={x:t.clientX*this.scale/(e.visualViewport.scale*this.scale),y:t.clientY*this.scale/(e.visualViewport.scale*this.scale)};o.onTap(l)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}}),this.metaViewport=n;const a={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{var i,n,a;const h=e.document.documentElement;console.log(`docElement ${h.scrollLeft} ${h.scrollTop}`),console.log(`scale ${null===(i=e.visualViewport)||void 0===i?void 0:i.scale}`),console.log(`visualviewport ${null===(n=e.visualViewport)||void 0===n?void 0:n.width} ${null===(a=e.visualViewport)||void 0===a?void 0:a.height}`);const l=s.getBoundingClientRect();console.log(`boundingRect $} ${l.left} ${l.top}`);const r={x:(t.x+l.left)*this.scale/(e.visualViewport.scale*this.scale),y:(t.y+l.top)*this.scale/(e.visualViewport.scale*this.scale)};o.onTap(r)},onLinkActivated:t=>{o.onLinkActivated(t)}};this.page=new t(e,s,a)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const o=document.getElementById("page"),a=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,o){const a=new n(o);this.manager=new s(t,e,i,a)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,o){const a={width:t,height:e},h={top:i,left:o,bottom:n,right:s};this.manager.setViewport(a,h)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,o,a,window.gestures)}(); //# sourceMappingURL=fixed-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-single-script.js.map b/readium/navigators/web/scripts/dist/fixed-single-script.js.map index 4cd16539e0..0dc919039b 100644 --- a/readium/navigators/web/scripts/dist/fixed-single-script.js.map +++ b/readium/navigators/web/scripts/dist/fixed-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n console.log(`onmessage ${message}`);\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n console.log(\"tap detected\");\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n const wrapperGesturesListener = {\n onTap: (event) => {\n var _a, _b, _c;\n console.log(`metaViewport ${metaViewport.content}`);\n const docElement = window.document.documentElement;\n console.log(`docElement ${docElement.scrollLeft} ${docElement.scrollTop}`);\n console.log(`scale ${(_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale}`);\n console.log(`visualviewport ${(_b = window.visualViewport) === null || _b === void 0 ? void 0 : _b.width} ${(_c = window.visualViewport) === null || _c === void 0 ? void 0 : _c.height}`);\n const tapEvent = {\n x: (event.clientX * this.scale) /\n (window.visualViewport.scale * this.scale),\n y: (event.clientY * this.scale) /\n (window.visualViewport.scale * this.scale),\n };\n listener.onTap(tapEvent);\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n var _a, _b, _c;\n const docElement = window.document.documentElement;\n console.log(`docElement ${docElement.scrollLeft} ${docElement.scrollTop}`);\n console.log(`scale ${(_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale}`);\n console.log(`visualviewport ${(_b = window.visualViewport) === null || _b === void 0 ? void 0 : _b.width} ${(_c = window.visualViewport) === null || _c === void 0 ? void 0 : _c.height}`);\n const boundingRect = iframe.getBoundingClientRect();\n console.log(`boundingRect $} ${boundingRect.left} ${boundingRect.top}`);\n const tapEvent = {\n x: ((event.x + boundingRect.left) * this.scale) /\n (window.visualViewport.scale * this.scale),\n y: ((event.y + boundingRect.top) * this.scale) /\n (window.visualViewport.scale * this.scale),\n };\n listener.onTap(tapEvent);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","console","log","onMessageFromIframe","postMessage","port2","data","x","y","onTap","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","target","Element","nearestInteractiveElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","SingleAreaManager","metaViewport","fit","insets","_a","_b","_c","docElement","documentElement","scrollLeft","scrollTop","visualViewport","tapEvent","clientX","clientY","pageListener","boundingRect","getBoundingClientRect","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n console.log(`onmessage ${message}`);\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n else if (message.data.href) {\n this.listener.onLinkActivated(message.data.href);\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n console.log(\"tap detected\");\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n const wrapperGesturesListener = {\n onTap: (event) => {\n var _a, _b, _c;\n console.log(`metaViewport ${metaViewport.content}`);\n const docElement = window.document.documentElement;\n console.log(`docElement ${docElement.scrollLeft} ${docElement.scrollTop}`);\n console.log(`scale ${(_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale}`);\n console.log(`visualviewport ${(_b = window.visualViewport) === null || _b === void 0 ? void 0 : _b.width} ${(_c = window.visualViewport) === null || _c === void 0 ? void 0 : _c.height}`);\n const tapEvent = {\n x: (event.clientX * this.scale) /\n (window.visualViewport.scale * this.scale),\n y: (event.clientY * this.scale) /\n (window.visualViewport.scale * this.scale),\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n var _a, _b, _c;\n const docElement = window.document.documentElement;\n console.log(`docElement ${docElement.scrollLeft} ${docElement.scrollTop}`);\n console.log(`scale ${(_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale}`);\n console.log(`visualviewport ${(_b = window.visualViewport) === null || _b === void 0 ? void 0 : _b.width} ${(_c = window.visualViewport) === null || _c === void 0 ? void 0 : _c.height}`);\n const boundingRect = iframe.getBoundingClientRect();\n console.log(`boundingRect $} ${boundingRect.left} ${boundingRect.top}`);\n const tapEvent = {\n x: ((event.x + boundingRect.left) * this.scale) /\n (window.visualViewport.scale * this.scale),\n y: ((event.y + boundingRect.top) * this.scale) /\n (window.visualViewport.scale * this.scale),\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","console","log","onMessageFromIframe","postMessage","port2","data","x","y","onTap","href","onLinkActivated","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","SingleAreaManager","metaViewport","fit","insets","_a","_b","_c","docElement","documentElement","scrollLeft","scrollTop","visualViewport","tapEvent","clientX","clientY","_","pageListener","boundingRect","getBoundingClientRect","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/src/bridge/fixed-gestures-bridge.ts b/readium/navigators/web/scripts/src/bridge/fixed-gestures-bridge.ts index 0064c51916..bb1dd452be 100644 --- a/readium/navigators/web/scripts/src/bridge/fixed-gestures-bridge.ts +++ b/readium/navigators/web/scripts/src/bridge/fixed-gestures-bridge.ts @@ -2,6 +2,7 @@ import { AreaManager } from "../fixed/area-manager" export interface GesturesBridge { onTap(event: string): void + onLinkActivated(href: string): void } export interface TapEvent { @@ -19,4 +20,8 @@ export class BridgeGesturesAdapter implements AreaManager.Listener { onTap(event: TapEvent): void { this.nativeApi.onTap(JSON.stringify(event)) } + + onLinkActivated(href: string): void { + this.nativeApi.onLinkActivated(href) + } } diff --git a/readium/navigators/web/scripts/src/common/gestures.ts b/readium/navigators/web/scripts/src/common/gestures.ts index a8be158aa6..1cc49a7f24 100644 --- a/readium/navigators/web/scripts/src/common/gestures.ts +++ b/readium/navigators/web/scripts/src/common/gestures.ts @@ -1,5 +1,6 @@ export interface GesturesListener { onTap(event: MouseEvent): void + onLinkActivated(href: string): void } export class GesturesDetector { @@ -37,22 +38,28 @@ export class GesturesDetector { return } - if ( - event.target instanceof Element && - this.nearestInteractiveElement(event.target) - ) { - return + let nearestElement: Element | null + if (event.target instanceof HTMLElement) { + nearestElement = this.nearestInteractiveElement(event.target) + } else { + nearestElement = null } - console.log("tap detected") - this.listener.onTap(event) + if (nearestElement) { + if (nearestElement instanceof HTMLAnchorElement) { + this.listener.onLinkActivated(nearestElement.href) + } + } else { + console.log("tap detected") + this.listener.onTap(event) + } event.stopPropagation() event.preventDefault() } // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling - private nearestInteractiveElement(element: Element): string | null { + private nearestInteractiveElement(element: Element): Element | null { if (element == null) { return null } @@ -71,7 +78,7 @@ export class GesturesDetector { "video", ] if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) { - return element.outerHTML + return element } // Checks whether the element is editable by the user. @@ -79,7 +86,7 @@ export class GesturesDetector { element.hasAttribute("contenteditable") && element.getAttribute("contenteditable")!.toLowerCase() != "false" ) { - return element.outerHTML + return element } // Checks parents recursively because the touch might be for example on an inside a . diff --git a/readium/navigators/web/scripts/src/fixed/area-manager.ts b/readium/navigators/web/scripts/src/fixed/area-manager.ts index 5d4d2a6873..24641faf9e 100644 --- a/readium/navigators/web/scripts/src/fixed/area-manager.ts +++ b/readium/navigators/web/scripts/src/fixed/area-manager.ts @@ -3,5 +3,6 @@ import { TapEvent } from "../common/events" export namespace AreaManager { export interface Listener { onTap(event: TapEvent): void + onLinkActivated(href: string): void } } diff --git a/readium/navigators/web/scripts/src/fixed/double-area-manager.ts b/readium/navigators/web/scripts/src/fixed/double-area-manager.ts index fca456edff..f0fcd65270 100644 --- a/readium/navigators/web/scripts/src/fixed/double-area-manager.ts +++ b/readium/navigators/web/scripts/src/fixed/double-area-manager.ts @@ -32,6 +32,10 @@ export class DoubleAreaManager { onTap: (event: MouseEvent) => { listener.onTap({ x: event.clientX, y: event.clientY }) }, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + onLinkActivated: (_: string) => { + throw Error("No interactive element in the root document.") + }, } new GesturesDetector(window, wrapperGesturesListener) @@ -42,6 +46,9 @@ export class DoubleAreaManager { onTap: (event: TapEvent) => { listener.onTap(event) }, + onLinkActivated: (href: string) => { + listener.onLinkActivated(href) + }, } this.leftPage = new PageManager(window, leftIframe, pageListener) this.rightPage = new PageManager(window, rightIframe, pageListener) diff --git a/readium/navigators/web/scripts/src/fixed/page-manager.ts b/readium/navigators/web/scripts/src/fixed/page-manager.ts index 85269ad018..892e3d9c15 100644 --- a/readium/navigators/web/scripts/src/fixed/page-manager.ts +++ b/readium/navigators/web/scripts/src/fixed/page-manager.ts @@ -91,6 +91,8 @@ export class PageManager { private onMessageFromIframe(message: MessageEvent) { if (message.data.x && message.data.y) { this.listener.onTap({ x: message.data.x, y: message.data.y }) + } else if (message.data.href) { + this.listener.onLinkActivated(message.data.href) } } @@ -119,5 +121,6 @@ export namespace PageManager { export interface Listener { onIframeLoaded(): void onTap(event: TapEvent): void + onLinkActivated(href: string): void } } diff --git a/readium/navigators/web/scripts/src/fixed/single-area-manager.ts b/readium/navigators/web/scripts/src/fixed/single-area-manager.ts index 0ba3965bdc..af9c863f89 100644 --- a/readium/navigators/web/scripts/src/fixed/single-area-manager.ts +++ b/readium/navigators/web/scripts/src/fixed/single-area-manager.ts @@ -47,6 +47,10 @@ export class SingleAreaManager { } listener.onTap(tapEvent) }, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + onLinkActivated: (_: string) => { + throw Error("No interactive element in the root document.") + }, } new GesturesDetector(window, wrapperGesturesListener) @@ -76,6 +80,9 @@ export class SingleAreaManager { } listener.onTap(tapEvent) }, + onLinkActivated: (href: string) => { + listener.onLinkActivated(href) + }, } this.page = new PageManager(window, iframe, pageListener) } diff --git a/readium/navigators/web/scripts/src/index-fixed-injectable.ts b/readium/navigators/web/scripts/src/index-fixed-injectable.ts index f06eea41d5..9a643ce659 100644 --- a/readium/navigators/web/scripts/src/index-fixed-injectable.ts +++ b/readium/navigators/web/scripts/src/index-fixed-injectable.ts @@ -31,4 +31,8 @@ class MessagingGesturesListener implements GesturesListener { const tapEvent = { x: event.clientX, y: event.clientY } this.messagePort.postMessage(tapEvent) } + + onLinkActivated(href: string): void { + this.messagePort.postMessage({ href: href }) + } } diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js index 27bb8eb5ea..36cdcac9b7 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{console.log(`onmessage ${t}`),this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y&&this.listener.onTap({x:t.data.x,y:t.data.y})}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const h=parseFloat(i.get("width")),n=parseFloat(i.get("height"));return h&&n?{width:h,height:n}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){console.log(`Constructing Gesturesdetector for window ${t}`),this.window=t,this.listener=e,document.addEventListener("click",(t=>{console.log("onClick"),this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();e&&"Range"==e.type||t.target instanceof Element&&this.nearestInteractiveElement(t.target)||(console.log("tap detected"),this.listener.onTap(t),t.stopPropagation(),t.preventDefault())}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t.outerHTML:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,h,n,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},new i(e,{onTap:t=>{a.onTap({x:t.clientX,y:t.clientY})}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{a.onTap(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,h,o),this.metaViewport=n}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,h=Math.max(this.leftPage.size.height,this.rightPage.size.height),n={width:s,height:h},a={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,n,a);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(h).build(),this.leftPage.show(),this.rightPage.show()}}class h{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}}const n=document.getElementById("page-left"),a=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,n,a){const o=new h(a);this.manager=new s(t,e,i,n,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,h,n){const a={width:t,height:e},o={top:i,left:n,bottom:h,right:s};this.manager.setViewport(a,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,n,a,o,window.gestures)}(); +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{console.log(`onmessage ${t}`),this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y?this.listener.onTap({x:t.data.x,y:t.data.y}):t.data.href&&this.listener.onLinkActivated(t.data.href)}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),h=parseFloat(i.get("height"));return n&&h?{width:n,height:h}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){console.log(`Constructing Gesturesdetector for window ${t}`),this.window=t,this.listener=e,document.addEventListener("click",(t=>{console.log("onClick"),this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):(console.log("tap detected"),this.listener.onTap(t)),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,h,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},new i(e,{onTap:t=>{a.onTap({x:t.clientX,y:t.clientY})},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{a.onTap(t)},onLinkActivated:t=>{a.onLinkActivated(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,n,o),this.metaViewport=h}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,n=Math.max(this.leftPage.size.height,this.rightPage.size.height),h={width:s,height:n},a={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,h,a);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(n).build(),this.leftPage.show(),this.rightPage.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const h=document.getElementById("page-left"),a=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,h,a){const o=new n(a);this.manager=new s(t,e,i,h,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,n,h){const a={width:t,height:e},o={top:i,left:h,bottom:n,right:s};this.manager.setViewport(a,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,h,a,o,window.gestures)}(); //# sourceMappingURL=fixed-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map index 10fb36ad65..2f60361fe2 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n console.log(`onmessage ${message}`);\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n console.log(\"tap detected\");\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const wrapperGesturesListener = {\n onTap: (event) => {\n listener.onTap({ x: event.clientX, y: event.clientY });\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const pageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n listener.onTap(event);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, pageListener);\n this.rightPage = new PageManager(window, rightIframe, pageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","console","log","onMessageFromIframe","postMessage","port2","data","x","y","onTap","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","target","Element","nearestInteractiveElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","clientX","clientY","pageListener","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n console.log(`onmessage ${message}`);\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n else if (message.data.href) {\n this.listener.onLinkActivated(message.data.href);\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n console.log(\"tap detected\");\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const wrapperGesturesListener = {\n onTap: (event) => {\n listener.onTap({ x: event.clientX, y: event.clientY });\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const pageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n listener.onTap(event);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, pageListener);\n this.rightPage = new PageManager(window, rightIframe, pageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","console","log","onMessageFromIframe","postMessage","port2","data","x","y","onTap","href","onLinkActivated","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","clientX","clientY","_","pageListener","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js index e663803c00..cf62076439 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class e{constructor(e,t){console.log(`Constructing Gesturesdetector for window ${e}`),this.window=e,this.listener=t,document.addEventListener("click",(e=>{console.log("onClick"),this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();t&&"Range"==t.type||e.target instanceof Element&&this.nearestInteractiveElement(e.target)||(console.log("tap detected"),this.listener.onTap(e),e.stopPropagation(),e.preventDefault())}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e.outerHTML:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}window.addEventListener("message",(n=>{if(n.ports[0]){console.log("receiving port");const o=n.ports[0],s=new t(o);new e(window,s)}}));class t{constructor(e){this.messagePort=e}onTap(e){console.log("posting event");const t={x:e.clientX,y:e.clientY};this.messagePort.postMessage(t)}}}(); +!function(){"use strict";class e{constructor(e,t){console.log(`Constructing Gesturesdetector for window ${e}`),this.window=e,this.listener=t,document.addEventListener("click",(e=>{console.log("onClick"),this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();if(t&&"Range"==t.type)return;let n;n=e.target instanceof HTMLElement?this.nearestInteractiveElement(e.target):null,n?n instanceof HTMLAnchorElement&&this.listener.onLinkActivated(n.href):(console.log("tap detected"),this.listener.onTap(e)),e.stopPropagation(),e.preventDefault()}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}window.addEventListener("message",(n=>{if(n.ports[0]){console.log("receiving port");const o=n.ports[0],s=new t(o);new e(window,s)}}));class t{constructor(e){this.messagePort=e}onTap(e){console.log("posting event");const t={x:e.clientX,y:e.clientY};this.messagePort.postMessage(t)}onLinkActivated(e){this.messagePort.postMessage({href:e})}}}(); //# sourceMappingURL=fixed-injectable-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map index 22c6008e17..016031e632 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAAO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAChBC,QAAQC,IAAI,4CAA4CH,KACxDI,KAAKJ,OAASA,EACdI,KAAKH,SAAWA,EAChBI,SAASC,iBAAiB,SAAUC,IAChCL,QAAQC,IAAI,WACZC,KAAKI,QAAQD,EAAM,IACpB,EAIP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKJ,OAAOW,eAC1BD,GAA+B,SAAlBA,EAAUE,MAMvBL,EAAMM,kBAAkBC,SACxBV,KAAKW,0BAA0BR,EAAMM,UAGzCX,QAAQC,IAAI,gBACZC,KAAKH,SAASe,MAAMT,GACpBA,EAAMU,kBACNV,EAAMW,iBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAAQM,UAQfN,EAAQO,cACDtB,KAAKW,0BAA0BI,EAAQO,eAE3C,IACX,ECxDJ1B,OAAOM,iBAAiB,WAAYC,IAChC,GAAIA,EAAMoB,MAAM,GAAI,CAChBzB,QAAQC,IAAI,kBACZ,MAAMyB,EAAcrB,EAAMoB,MAAM,GAC1BE,EAAoB,IAAIC,EAA0BF,GACxD,IAAI9B,EAAiBE,OAAQ6B,EACjC,KAEJ,MAAMC,EACF,WAAA/B,CAAY6B,GACRxB,KAAKwB,YAAcA,CACvB,CACA,KAAAZ,CAAMT,GACFL,QAAQC,IAAI,iBACZ,MAAM4B,EAAW,CAAEC,EAAGzB,EAAM0B,QAASC,EAAG3B,EAAM4B,SAC9C/B,KAAKwB,YAAYQ,YAAYL,EACjC,E","sources":["webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/index-fixed-injectable.ts"],"sourcesContent":["export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n console.log(\"tap detected\");\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nwindow.addEventListener(\"message\", (event) => {\n if (event.ports[0]) {\n console.log(\"receiving port\");\n const messagePort = event.ports[0];\n const messagingListener = new MessagingGesturesListener(messagePort);\n new GesturesDetector(window, messagingListener);\n }\n});\nclass MessagingGesturesListener {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n onTap(event) {\n console.log(\"posting event\");\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.messagePort.postMessage(tapEvent);\n }\n}\n"],"names":["GesturesDetector","constructor","window","listener","console","log","this","document","addEventListener","event","onClick","defaultPrevented","selection","getSelection","type","target","Element","nearestInteractiveElement","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","ports","messagePort","messagingListener","MessagingGesturesListener","tapEvent","x","clientX","y","clientY","postMessage"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAAO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAChBC,QAAQC,IAAI,4CAA4CH,KACxDI,KAAKJ,OAASA,EACdI,KAAKH,SAAWA,EAChBI,SAASC,iBAAiB,SAAUC,IAChCL,QAAQC,IAAI,WACZC,KAAKI,QAAQD,EAAM,IACpB,EAIP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKJ,OAAOW,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAN,EAAMO,kBAAkBC,YACPX,KAAKY,0BAA0BT,EAAMO,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1Bb,KAAKH,SAASiB,gBAAgBL,EAAeM,OAIjDjB,QAAQC,IAAI,gBACZC,KAAKH,SAASmB,MAAMb,IAExBA,EAAMc,kBACNd,EAAMe,gBACV,CAEA,yBAAAN,CAA0BO,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACDzB,KAAKY,0BAA0BO,EAAQM,eAE3C,IACX,EClEJ7B,OAAOM,iBAAiB,WAAYC,IAChC,GAAIA,EAAMuB,MAAM,GAAI,CAChB5B,QAAQC,IAAI,kBACZ,MAAM4B,EAAcxB,EAAMuB,MAAM,GAC1BE,EAAoB,IAAIC,EAA0BF,GACxD,IAAIjC,EAAiBE,OAAQgC,EACjC,KAEJ,MAAMC,EACF,WAAAlC,CAAYgC,GACR3B,KAAK2B,YAAcA,CACvB,CACA,KAAAX,CAAMb,GACFL,QAAQC,IAAI,iBACZ,MAAM+B,EAAW,CAAEC,EAAG5B,EAAM6B,QAASC,EAAG9B,EAAM+B,SAC9ClC,KAAK2B,YAAYQ,YAAYL,EACjC,CACA,eAAAhB,CAAgBC,GACZf,KAAK2B,YAAYQ,YAAY,CAAEpB,KAAMA,GACzC,E","sources":["webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/index-fixed-injectable.ts"],"sourcesContent":["export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n console.log(\"tap detected\");\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nwindow.addEventListener(\"message\", (event) => {\n if (event.ports[0]) {\n console.log(\"receiving port\");\n const messagePort = event.ports[0];\n const messagingListener = new MessagingGesturesListener(messagePort);\n new GesturesDetector(window, messagingListener);\n }\n});\nclass MessagingGesturesListener {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n onTap(event) {\n console.log(\"posting event\");\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.messagePort.postMessage(tapEvent);\n }\n onLinkActivated(href) {\n this.messagePort.postMessage({ href: href });\n }\n}\n"],"names":["GesturesDetector","constructor","window","listener","console","log","this","document","addEventListener","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","onLinkActivated","href","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","ports","messagePort","messagingListener","MessagingGesturesListener","tapEvent","x","clientX","y","clientY","postMessage"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js index 8a50ccd1de..8becbdf98f 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{console.log(`onmessage ${t}`),this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y&&this.listener.onTap({x:t.data.x,y:t.data.y})}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),o=parseFloat(i.get("height"));return n&&o?{width:n,height:o}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){console.log(`Constructing Gesturesdetector for window ${t}`),this.window=t,this.listener=e,document.addEventListener("click",(t=>{console.log("onClick"),this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();e&&"Range"==e.type||t.target instanceof Element&&this.nearestInteractiveElement(t.target)||(console.log("tap detected"),this.listener.onTap(t),t.stopPropagation(),t.preventDefault())}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t.outerHTML:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,o){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,new i(e,{onTap:t=>{var i,s,a;console.log(`metaViewport ${n.content}`);const h=e.document.documentElement;console.log(`docElement ${h.scrollLeft} ${h.scrollTop}`),console.log(`scale ${null===(i=e.visualViewport)||void 0===i?void 0:i.scale}`),console.log(`visualviewport ${null===(s=e.visualViewport)||void 0===s?void 0:s.width} ${null===(a=e.visualViewport)||void 0===a?void 0:a.height}`);const l={x:t.clientX*this.scale/(e.visualViewport.scale*this.scale),y:t.clientY*this.scale/(e.visualViewport.scale*this.scale)};o.onTap(l)}}),this.metaViewport=n;const a={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{var i,n,a;const h=e.document.documentElement;console.log(`docElement ${h.scrollLeft} ${h.scrollTop}`),console.log(`scale ${null===(i=e.visualViewport)||void 0===i?void 0:i.scale}`),console.log(`visualviewport ${null===(n=e.visualViewport)||void 0===n?void 0:n.width} ${null===(a=e.visualViewport)||void 0===a?void 0:a.height}`);const l=s.getBoundingClientRect();console.log(`boundingRect $} ${l.left} ${l.top}`);const r={x:(t.x+l.left)*this.scale/(e.visualViewport.scale*this.scale),y:(t.y+l.top)*this.scale/(e.visualViewport.scale*this.scale)};o.onTap(r)}};this.page=new t(e,s,a)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}}const o=document.getElementById("page"),a=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,o){const a=new n(o);this.manager=new s(t,e,i,a)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,o){const a={width:t,height:e},h={top:i,left:o,bottom:n,right:s};this.manager.setViewport(a,h)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,o,a,window.gestures)}(); +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{console.log(`onmessage ${t}`),this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y?this.listener.onTap({x:t.data.x,y:t.data.y}):t.data.href&&this.listener.onLinkActivated(t.data.href)}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),o=parseFloat(i.get("height"));return n&&o?{width:n,height:o}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){console.log(`Constructing Gesturesdetector for window ${t}`),this.window=t,this.listener=e,document.addEventListener("click",(t=>{console.log("onClick"),this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):(console.log("tap detected"),this.listener.onTap(t)),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,o){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,new i(e,{onTap:t=>{var i,s,a;console.log(`metaViewport ${n.content}`);const h=e.document.documentElement;console.log(`docElement ${h.scrollLeft} ${h.scrollTop}`),console.log(`scale ${null===(i=e.visualViewport)||void 0===i?void 0:i.scale}`),console.log(`visualviewport ${null===(s=e.visualViewport)||void 0===s?void 0:s.width} ${null===(a=e.visualViewport)||void 0===a?void 0:a.height}`);const l={x:t.clientX*this.scale/(e.visualViewport.scale*this.scale),y:t.clientY*this.scale/(e.visualViewport.scale*this.scale)};o.onTap(l)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}}),this.metaViewport=n;const a={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{var i,n,a;const h=e.document.documentElement;console.log(`docElement ${h.scrollLeft} ${h.scrollTop}`),console.log(`scale ${null===(i=e.visualViewport)||void 0===i?void 0:i.scale}`),console.log(`visualviewport ${null===(n=e.visualViewport)||void 0===n?void 0:n.width} ${null===(a=e.visualViewport)||void 0===a?void 0:a.height}`);const l=s.getBoundingClientRect();console.log(`boundingRect $} ${l.left} ${l.top}`);const r={x:(t.x+l.left)*this.scale/(e.visualViewport.scale*this.scale),y:(t.y+l.top)*this.scale/(e.visualViewport.scale*this.scale)};o.onTap(r)},onLinkActivated:t=>{o.onLinkActivated(t)}};this.page=new t(e,s,a)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const o=document.getElementById("page"),a=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,o){const a=new n(o);this.manager=new s(t,e,i,a)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,o){const a={width:t,height:e},h={top:i,left:o,bottom:n,right:s};this.manager.setViewport(a,h)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,o,a,window.gestures)}(); //# sourceMappingURL=fixed-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map index 4cd16539e0..0dc919039b 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n console.log(`onmessage ${message}`);\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n if (event.target instanceof Element &&\n this.nearestInteractiveElement(event.target)) {\n return;\n }\n console.log(\"tap detected\");\n this.listener.onTap(event);\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element.outerHTML;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element.outerHTML;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n const wrapperGesturesListener = {\n onTap: (event) => {\n var _a, _b, _c;\n console.log(`metaViewport ${metaViewport.content}`);\n const docElement = window.document.documentElement;\n console.log(`docElement ${docElement.scrollLeft} ${docElement.scrollTop}`);\n console.log(`scale ${(_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale}`);\n console.log(`visualviewport ${(_b = window.visualViewport) === null || _b === void 0 ? void 0 : _b.width} ${(_c = window.visualViewport) === null || _c === void 0 ? void 0 : _c.height}`);\n const tapEvent = {\n x: (event.clientX * this.scale) /\n (window.visualViewport.scale * this.scale),\n y: (event.clientY * this.scale) /\n (window.visualViewport.scale * this.scale),\n };\n listener.onTap(tapEvent);\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n var _a, _b, _c;\n const docElement = window.document.documentElement;\n console.log(`docElement ${docElement.scrollLeft} ${docElement.scrollTop}`);\n console.log(`scale ${(_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale}`);\n console.log(`visualviewport ${(_b = window.visualViewport) === null || _b === void 0 ? void 0 : _b.width} ${(_c = window.visualViewport) === null || _c === void 0 ? void 0 : _c.height}`);\n const boundingRect = iframe.getBoundingClientRect();\n console.log(`boundingRect $} ${boundingRect.left} ${boundingRect.top}`);\n const tapEvent = {\n x: ((event.x + boundingRect.left) * this.scale) /\n (window.visualViewport.scale * this.scale),\n y: ((event.y + boundingRect.top) * this.scale) /\n (window.visualViewport.scale * this.scale),\n };\n listener.onTap(tapEvent);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","console","log","onMessageFromIframe","postMessage","port2","data","x","y","onTap","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","target","Element","nearestInteractiveElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","outerHTML","parentElement","SingleAreaManager","metaViewport","fit","insets","_a","_b","_c","docElement","documentElement","scrollLeft","scrollTop","visualViewport","tapEvent","clientX","clientY","pageListener","boundingRect","getBoundingClientRect","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-single-script.js","mappings":"yBACO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,EAAQC,GAGxB,GAFAC,KAAKC,QAAU,CAAEC,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GACpDL,KAAKM,QAAU,IAAIC,gBACdT,EAAOU,cACR,MAAMC,MAAM,mDAEhBT,KAAKD,SAAWA,EAChBC,KAAKF,OAASA,EACdE,KAAKF,OAAOY,iBAAiB,QAAQ,KACjCV,KAAKW,gBAAgB,GAE7B,CACA,IAAAC,GACIZ,KAAKF,OAAOe,MAAMC,QAAU,OAChC,CACA,IAAAC,GACIf,KAAKF,OAAOe,MAAMC,QAAU,MAChC,CAEA,UAAAE,CAAWf,GACHD,KAAKC,SAAWA,IAGpBD,KAAKF,OAAOe,MAAMI,UAAYjB,KAAKC,QAAQC,IAAM,KACjDF,KAAKF,OAAOe,MAAMK,WAAalB,KAAKC,QAAQI,KAAO,KACnDL,KAAKF,OAAOe,MAAMM,aAAenB,KAAKC,QAAQG,OAAS,KACvDJ,KAAKF,OAAOe,MAAMO,YAAcpB,KAAKC,QAAQE,MAAQ,KACzD,CAEA,QAAAkB,CAASC,GACLtB,KAAKF,OAAOyB,IAAMD,CACtB,CAEA,cAAAE,CAAeC,GACXzB,KAAKF,OAAOe,MAAMa,MAAQD,EAAKC,MAAQ,KACvC1B,KAAKF,OAAOe,MAAMc,OAASF,EAAKE,OAAS,KACzC3B,KAAKyB,KAAOA,CAChB,CACA,cAAAd,GACI,MAAMiB,EAAW5B,KAAKF,OAAOU,cAAcqB,SAASC,cAAc,uBAClE,IAAKF,GAAYA,aAAoBG,gBAEjC,OAEJ,MAAMC,EAAWhC,KAAKiC,cAAcL,GAC/BI,IAILhC,KAAKF,OAAOe,MAAMa,MAAQM,EAASN,MAAQ,KAC3C1B,KAAKF,OAAOe,MAAMc,OAASK,EAASL,OAAS,KAC7C3B,KAAKyB,KAAOO,EACZhC,KAAKM,QAAQ4B,MAAMC,UAAaC,IAC5BC,QAAQC,IAAI,aAAaF,KACzBpC,KAAKuC,oBAAoBH,EAAQ,EAErCpC,KAAKF,OAAOU,cAAcgC,YAAY,OAAQ,IAAK,CAACxC,KAAKM,QAAQmC,QACjEzC,KAAKD,SAASY,iBAClB,CACA,mBAAA4B,CAAoBH,GACZA,EAAQM,KAAKC,GAAKP,EAAQM,KAAKE,EAC/B5C,KAAKD,SAAS8C,MAAM,CAAEF,EAAGP,EAAQM,KAAKC,EAAGC,EAAGR,EAAQM,KAAKE,IAEpDR,EAAQM,KAAKI,MAClB9C,KAAKD,SAASgD,gBAAgBX,EAAQM,KAAKI,KAEnD,CAEA,aAAAb,CAAce,GACV,MAAMC,EAAQ,uBACRC,EAAa,IAAIC,IACvB,IAAIC,EACJ,KAAQA,EAAQH,EAAMI,KAAKL,EAAaM,UACvB,MAATF,GACAF,EAAWK,IAAIH,EAAM,GAAIA,EAAM,IAGvC,MAAM1B,EAAQ8B,WAAWN,EAAWO,IAAI,UAClC9B,EAAS6B,WAAWN,EAAWO,IAAI,WACzC,OAAI/B,GAASC,EACF,CAAED,QAAOC,eAGhB,CAER,ECvFG,MAAM+B,EACT,eAAAC,CAAgBC,GAEZ,OADA5D,KAAK6D,aAAeD,EACb5D,IACX,CACA,eAAA8D,CAAgBF,GAEZ,OADA5D,KAAK+D,aAAeH,EACb5D,IACX,CACA,QAAAgE,CAAStC,GAEL,OADA1B,KAAK0B,MAAQA,EACN1B,IACX,CACA,SAAAiE,CAAUtC,GAEN,OADA3B,KAAK2B,OAASA,EACP3B,IACX,CACA,KAAAkE,GACI,MAAMC,EAAa,GAanB,OAZInE,KAAK6D,cACLM,EAAWC,KAAK,iBAAmBpE,KAAK6D,cAExC7D,KAAK+D,cACLI,EAAWC,KAAK,iBAAmBpE,KAAK+D,cAExC/D,KAAK0B,OACLyC,EAAWC,KAAK,SAAWpE,KAAK0B,OAEhC1B,KAAK2B,QACLwC,EAAWC,KAAK,UAAYpE,KAAK2B,QAE9BwC,EAAWE,KAAK,KAC3B,EChCG,MAAMC,EACT,WAAA1E,CAAYC,EAAQE,GAChBsC,QAAQC,IAAI,4CAA4CzC,KACxDG,KAAKH,OAASA,EACdG,KAAKD,SAAWA,EAChB8B,SAASnB,iBAAiB,SAAU6D,IAChClC,QAAQC,IAAI,WACZtC,KAAKwE,QAAQD,EAAM,IACpB,EAIP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAY1E,KAAKH,OAAO8E,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAN,EAAMO,kBAAkBC,YACP/E,KAAKgF,0BAA0BT,EAAMO,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1BjF,KAAKD,SAASgD,gBAAgB8B,EAAe/B,OAIjDT,QAAQC,IAAI,gBACZtC,KAAKD,SAAS8C,MAAM0B,IAExBA,EAAMW,kBACNX,EAAMY,gBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACD1F,KAAKgF,0BAA0BI,EAAQM,eAE3C,IACX,ECvEG,MAAMC,EACT,WAAA/F,CAAYC,EAAQC,EAAQ8F,EAAc7F,GACtCC,KAAK6F,IAAM,UACX7F,KAAK8F,OAAS,CAAE5F,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GACnDL,KAAK4D,MAAQ,EAsBb,IAAIU,EAAiBzE,EArBW,CAC5BgD,MAAQ0B,IACJ,IAAIwB,EAAIC,EAAIC,EACZ5D,QAAQC,IAAI,gBAAgBsD,EAAatC,WACzC,MAAM4C,EAAarG,EAAOgC,SAASsE,gBACnC9D,QAAQC,IAAI,cAAc4D,EAAWE,cAAcF,EAAWG,aAC9DhE,QAAQC,IAAI,SAA0C,QAAhCyD,EAAKlG,EAAOyG,sBAAmC,IAAPP,OAAgB,EAASA,EAAGnC,SAC1FvB,QAAQC,IAAI,kBAAmD,QAAhC0D,EAAKnG,EAAOyG,sBAAmC,IAAPN,OAAgB,EAASA,EAAGtE,SAA0C,QAAhCuE,EAAKpG,EAAOyG,sBAAmC,IAAPL,OAAgB,EAASA,EAAGtE,UACjL,MAAM4E,EAAW,CACb5D,EAAI4B,EAAMiC,QAAUxG,KAAK4D,OACpB/D,EAAOyG,eAAe1C,MAAQ5D,KAAK4D,OACxChB,EAAI2B,EAAMkC,QAAUzG,KAAK4D,OACpB/D,EAAOyG,eAAe1C,MAAQ5D,KAAK4D,QAE5C7D,EAAS8C,MAAM0D,EAAS,EAG5BxD,gBAAkB2D,IACd,MAAMjG,MAAM,+CAA+C,IAInET,KAAK4F,aAAeA,EACpB,MAAMe,EAAe,CACjBhG,eAAgB,KACZX,KAAKW,gBAAgB,EAEzBkC,MAAQ0B,IACJ,IAAIwB,EAAIC,EAAIC,EACZ,MAAMC,EAAarG,EAAOgC,SAASsE,gBACnC9D,QAAQC,IAAI,cAAc4D,EAAWE,cAAcF,EAAWG,aAC9DhE,QAAQC,IAAI,SAA0C,QAAhCyD,EAAKlG,EAAOyG,sBAAmC,IAAPP,OAAgB,EAASA,EAAGnC,SAC1FvB,QAAQC,IAAI,kBAAmD,QAAhC0D,EAAKnG,EAAOyG,sBAAmC,IAAPN,OAAgB,EAASA,EAAGtE,SAA0C,QAAhCuE,EAAKpG,EAAOyG,sBAAmC,IAAPL,OAAgB,EAASA,EAAGtE,UACjL,MAAMiF,EAAe9G,EAAO+G,wBAC5BxE,QAAQC,IAAI,mBAAmBsE,EAAavG,QAAQuG,EAAa1G,OACjE,MAAMqG,EAAW,CACb5D,GAAK4B,EAAM5B,EAAIiE,EAAavG,MAAQL,KAAK4D,OACpC/D,EAAOyG,eAAe1C,MAAQ5D,KAAK4D,OACxChB,GAAK2B,EAAM3B,EAAIgE,EAAa1G,KAAOF,KAAK4D,OACnC/D,EAAOyG,eAAe1C,MAAQ5D,KAAK4D,QAE5C7D,EAAS8C,MAAM0D,EAAS,EAE5BxD,gBAAkBD,IACd/C,EAASgD,gBAAgBD,EAAK,GAGtC9C,KAAK8G,KAAO,IAAInH,EAAYE,EAAQC,EAAQ6G,EAChD,CACA,WAAAI,CAAYnF,EAAUkE,GACd9F,KAAK4B,UAAYA,GAAY5B,KAAK8F,QAAUA,IAGhD9F,KAAK4B,SAAWA,EAChB5B,KAAK8F,OAASA,EACd9F,KAAKgH,SACT,CACA,MAAAC,CAAOpB,GACC7F,KAAK6F,KAAOA,IAGhB7F,KAAK6F,IAAMA,EACX7F,KAAKgH,SACT,CACA,YAAAE,CAAa5F,GACTtB,KAAK8G,KAAK/F,OACVf,KAAK8G,KAAKzF,SAASC,EACvB,CACA,cAAAX,GACSX,KAAK8G,KAAKrF,MAIXzB,KAAKgH,QAEb,CACA,MAAAA,GACI,IAAKhH,KAAK8G,KAAKrF,OAASzB,KAAK4B,SACzB,OAEJ,MAAM3B,EAAU,CACZC,IAAKF,KAAK8F,OAAO5F,IACjBC,MAAOH,KAAK8F,OAAO3F,MACnBC,OAAQJ,KAAK8F,OAAO1F,OACpBC,KAAML,KAAK8F,OAAOzF,MAEtBL,KAAK8G,KAAK9F,WAAWf,GACrB,MAAMkH,EAAkB,CACpBzF,MAAO1B,KAAK4B,SAASF,MAAQ1B,KAAK8F,OAAOzF,KAAOL,KAAK8F,OAAO3F,MAC5DwB,OAAQ3B,KAAK4B,SAASD,OAAS3B,KAAK8F,OAAO5F,IAAMF,KAAK8F,OAAO1F,QAE3DwD,ECpGP,SAAsBiC,EAAKvC,EAAS8D,GACvC,OAAQvB,GACJ,IAAK,UACD,OAOZ,SAAoBvC,EAAS8D,GACzB,MAAMC,EAAaD,EAAU1F,MAAQ4B,EAAQ5B,MACvC4F,EAAcF,EAAUzF,OAAS2B,EAAQ3B,OAC/C,OAAO4F,KAAKC,IAAIH,EAAYC,EAChC,CAXmBG,CAAWnE,EAAS8D,GAC/B,IAAK,QACD,OAUZ,SAAkB9D,EAAS8D,GACvB,OAAOA,EAAU1F,MAAQ4B,EAAQ5B,KACrC,CAZmBgG,CAASpE,EAAS8D,GAC7B,IAAK,SACD,OAWZ,SAAmB9D,EAAS8D,GACxB,OAAOA,EAAUzF,OAAS2B,EAAQ3B,MACtC,CAbmBgG,CAAUrE,EAAS8D,GAEtC,CD2FsBQ,CAAa5H,KAAK6F,IAAK7F,KAAK8G,KAAKrF,KAAM0F,GACrDnH,KAAK4F,aAAatC,SAAU,IAAII,GAC3BC,gBAAgBC,GAChBE,gBAAgBF,GAChBI,SAAShE,KAAK8G,KAAKrF,KAAKC,OACxBuC,UAAUjE,KAAK8G,KAAKrF,KAAKE,QACzBuC,QACLlE,KAAK4D,MAAQA,EACb5D,KAAK8G,KAAKlG,MACd,EE7GG,MAAMiH,EACT,WAAAjI,CAAYkI,GACR9H,KAAK+H,UAAYD,CACrB,CACA,KAAAjF,CAAM0B,GACFvE,KAAK+H,UAAUlF,MAAMmF,KAAKC,UAAU1D,GACxC,CACA,eAAAxB,CAAgBD,GACZ9C,KAAK+H,UAAUhF,gBAAgBD,EACnC,ECHJ,MAAMhD,EAAS+B,SAASqG,eAAe,QACjCtC,EAAe/D,SAASC,cAAc,uBAC5CjC,OAAOsI,WAAa,ICNb,MACH,WAAAvI,CAAYC,EAAQC,EAAQ8F,EAAcwC,GACtC,MAAMrI,EAAW,IAAI8H,EAAsBO,GAC3CpI,KAAKqI,QAAU,IAAI1C,EAAkB9F,EAAQC,EAAQ8F,EAAc7F,EACvE,CACA,YAAAmH,CAAa5F,GACTtB,KAAKqI,QAAQnB,aAAa5F,EAC9B,CACA,WAAAyF,CAAYuB,EAAgBC,EAAgBC,EAAUC,EAAYC,EAAaC,GAC3E,MAAM/G,EAAW,CAAEF,MAAO4G,EAAgB3G,OAAQ4G,GAC5CzC,EAAS,CACX5F,IAAKsI,EACLnI,KAAMsI,EACNvI,OAAQsI,EACRvI,MAAOsI,GAEXzI,KAAKqI,QAAQtB,YAAYnF,EAAUkE,EACvC,CACA,MAAAmB,CAAOpB,GACH,GAAW,WAAPA,GAA2B,SAAPA,GAAyB,UAAPA,EACtC,MAAMpF,MAAM,sBAAsBoF,KAEtC7F,KAAKqI,QAAQpB,OAAOpB,EACxB,GDjBsChG,OAAQC,EAAQ8F,EAAc/F,OAAOuI,S","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n console.log(`onmessage ${message}`);\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n else if (message.data.href) {\n this.listener.onLinkActivated(message.data.href);\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n console.log(\"tap detected\");\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n const wrapperGesturesListener = {\n onTap: (event) => {\n var _a, _b, _c;\n console.log(`metaViewport ${metaViewport.content}`);\n const docElement = window.document.documentElement;\n console.log(`docElement ${docElement.scrollLeft} ${docElement.scrollTop}`);\n console.log(`scale ${(_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale}`);\n console.log(`visualviewport ${(_b = window.visualViewport) === null || _b === void 0 ? void 0 : _b.width} ${(_c = window.visualViewport) === null || _c === void 0 ? void 0 : _c.height}`);\n const tapEvent = {\n x: (event.clientX * this.scale) /\n (window.visualViewport.scale * this.scale),\n y: (event.clientY * this.scale) /\n (window.visualViewport.scale * this.scale),\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n var _a, _b, _c;\n const docElement = window.document.documentElement;\n console.log(`docElement ${docElement.scrollLeft} ${docElement.scrollTop}`);\n console.log(`scale ${(_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale}`);\n console.log(`visualviewport ${(_b = window.visualViewport) === null || _b === void 0 ? void 0 : _b.width} ${(_c = window.visualViewport) === null || _c === void 0 ? void 0 : _c.height}`);\n const boundingRect = iframe.getBoundingClientRect();\n console.log(`boundingRect $} ${boundingRect.left} ${boundingRect.top}`);\n const tapEvent = {\n x: ((event.x + boundingRect.left) * this.scale) /\n (window.visualViewport.scale * this.scale),\n y: ((event.y + boundingRect.top) * this.scale) /\n (window.visualViewport.scale * this.scale),\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","console","log","onMessageFromIframe","postMessage","port2","data","x","y","onTap","href","onLinkActivated","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","SingleAreaManager","metaViewport","fit","insets","_a","_b","_c","docElement","documentElement","scrollLeft","scrollTop","visualViewport","tapEvent","clientX","clientY","_","pageListener","boundingRect","getBoundingClientRect","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt index dc50607422..0b74b0f027 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt @@ -62,7 +62,6 @@ public fun FixedWebNavigator( key = { index -> state.layout.value.pageIndexForSpread(index) }, reverseLayout = reverseLayout ) { index -> - when (val spread = state.layout.value.spreads[index]) { is SingleViewportSpread -> { val spreadState = remember { @@ -78,6 +77,9 @@ public fun FixedWebNavigator( SingleViewportSpread( onTap = onTap, + onLinkActivated = { url -> + state.readingOrder.indexOfHref(url)?.let { state.goToSync(it) } + }, state = spreadState, backgroundColor = backgroundColor ) @@ -96,6 +98,9 @@ public fun FixedWebNavigator( DoubleViewportSpread( onTap = onTap, + onLinkActivated = { url -> + state.readingOrder.indexOfHref(url)?.let { state.goToSync(it) } + }, state = spreadState, backgroundColor = backgroundColor ) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt index ecb8f10dec..585848b36f 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt @@ -8,6 +8,9 @@ import androidx.compose.runtime.Stable import androidx.compose.runtime.State import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.mutableStateOf +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.launch import org.readium.navigator.common.Configurable import org.readium.navigator.common.NavigatorState import org.readium.navigator.web.layout.Layout @@ -27,7 +30,7 @@ import org.readium.r2.shared.publication.Metadata @Stable public class FixedWebNavigatorState internal constructor( publicationMetadata: Metadata, - readingOrder: ReadingOrder, + internal val readingOrder: ReadingOrder, initialPreferences: FixedWebPreferences, defaults: FixedWebDefaults, initialItem: Int, @@ -44,6 +47,9 @@ public class FixedWebNavigatorState internal constructor( val prepaginatedDoubleContent: String ) + private val coroutineScope: CoroutineScope = + MainScope() + private val settingsResolver = FixedWebSettingsResolver(publicationMetadata, defaults) @@ -85,4 +91,10 @@ public class FixedWebNavigatorState internal constructor( layout.value.spreadIndexForPage(item), animationSpec = animationSpec ) + + internal fun goToSync(item: Int) { + coroutineScope.launch { + goTo((item)) + } + } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt index cd2818fe2a..1528884b5a 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt @@ -1,11 +1,17 @@ package org.readium.navigator.web.layout +import org.readium.r2.shared.DelicateReadiumApi import org.readium.r2.shared.publication.presentation.Presentation import org.readium.r2.shared.util.Url internal data class ReadingOrder( val items: List -) +) { + @OptIn(DelicateReadiumApi::class) + fun indexOfHref(href: Url): Int? = items + .indexOfFirst { it.href == href } + .takeUnless { it == -1 } +} internal data class ReadingOrderItem( val href: Url, diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt index f9af0e5aa2..47bf0f4552 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt @@ -23,10 +23,12 @@ import org.readium.r2.navigator.input.TapEvent import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl +import org.readium.r2.shared.util.Url @Composable internal fun DoubleViewportSpread( onTap: (TapEvent) -> Unit, + onLinkActivated: (Url) -> Unit, state: DoubleSpreadState, backgroundColor: Color ) { @@ -69,6 +71,7 @@ internal fun DoubleViewportSpread( state = webViewState, client = state.webViewClient, onTap = onTap, + onLinkActivated = { onLinkActivated(state.publicationBaseUrl.relativize(it)) }, backgroundColor = backgroundColor ) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt index ba8ac6aec3..5681ecb758 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt @@ -23,10 +23,12 @@ import org.readium.r2.navigator.input.TapEvent import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl +import org.readium.r2.shared.util.Url @Composable internal fun SingleViewportSpread( onTap: (TapEvent) -> Unit, + onLinkActivated: (Url) -> Unit, state: SingleSpreadState, backgroundColor: Color ) { @@ -69,6 +71,7 @@ internal fun SingleViewportSpread( state = webViewState, client = state.webViewClient, onTap = onTap, + onLinkActivated = { onLinkActivated(state.publicationBaseUrl.relativize(it)) }, backgroundColor = backgroundColor ) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt index 967cdbf202..1755de0f29 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt @@ -18,6 +18,7 @@ import org.readium.navigator.web.webview.WebView import org.readium.navigator.web.webview.WebViewScrollable2DState import org.readium.navigator.web.webview.WebViewState import org.readium.r2.navigator.input.TapEvent +import org.readium.r2.shared.util.AbsoluteUrl @SuppressLint("SetJavaScriptEnabled") @Composable @@ -25,6 +26,7 @@ internal fun SpreadWebView( state: WebViewState, client: WebViewClient, onTap: (TapEvent) -> Unit, + onLinkActivated: (AbsoluteUrl) -> Unit, backgroundColor: Color ) { val scrollableState = remember { WebViewScrollable2DState() } @@ -37,6 +39,10 @@ internal fun SpreadWebView( override fun onTap(point: PointF) { onTap(TapEvent(point)) } + + override fun onLinkActivated(href: AbsoluteUrl) { + onLinkActivated(href) + } } GesturesApi(density, listener) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/GesturesApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/GesturesApi.kt index 55b54891ab..a6766ecd8a 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/GesturesApi.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/GesturesApi.kt @@ -6,12 +6,14 @@ import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.dp import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json +import org.readium.r2.shared.util.AbsoluteUrl import org.readium.r2.shared.util.RelativeUrl import timber.log.Timber internal interface GesturesListener { fun onTap(point: PointF) + fun onLinkActivated(href: AbsoluteUrl) } internal class GesturesApi( @@ -37,6 +39,12 @@ internal class GesturesApi( Timber.d("onTap ${point.x} ${point.y}") listener.onTap(point) } + + @android.webkit.JavascriptInterface + fun onLinkActivated(href: String) { + val url = AbsoluteUrl(href) ?: return + listener.onLinkActivated(url) + } } @Serializable From ad23745efcc8ca2a4c5717beead7242693214d73 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Tue, 22 Oct 2024 21:40:32 +0200 Subject: [PATCH 46/61] Fix tap coordinates --- .../navigator/common/HyperlinkListener.kt | 84 +++++++++ .../readium/navigator/common/InputListener.kt | 176 ++++++++++++++++++ .../org/readium/navigator/common/Navigator.kt | 11 ++ .../navigator/common/NavigatorState.kt | 3 - .../readium/navigator/common/Overflowable.kt | 35 ++++ .../readium/navigator/common/ReadingOrder.kt | 28 +++ readium/navigators/demo/build.gradle.kts | 1 + .../readium/navigator/demo/DemoViewModel.kt | 2 +- .../readium/navigator/demo/reader/Reader.kt | 54 +++++- .../navigator/demo/reader/ReaderOpener.kt | 6 +- .../navigator/demo/util/WebLauncher.kt | 35 ++++ .../org/readium/navigator/pdf/PdfNavigator.kt | 22 ++- .../navigator/pdf/PdfNavigatorFactory.kt | 11 ++ .../navigator/pdf/PdfNavigatorState.kt | 23 ++- .../org/readium/navigator/pdf/ReadingOrder.kt | 12 ++ .../web/scripts/dist/fixed-double-index.html | 21 ++- .../web/scripts/dist/fixed-double-script.js | 2 +- .../scripts/dist/fixed-double-script.js.map | 2 +- .../scripts/dist/fixed-injectable-script.js | 2 +- .../dist/fixed-injectable-script.js.map | 2 +- .../web/scripts/dist/fixed-single-script.js | 2 +- .../scripts/dist/fixed-single-script.js.map | 2 +- .../scripts/public/fixed-double-index.html | 21 ++- .../web/scripts/src/common/gestures.ts | 6 - .../scripts/src/fixed/double-area-manager.ts | 47 ++++- .../web/scripts/src/fixed/page-manager.ts | 12 +- .../scripts/src/fixed/single-area-manager.ts | 36 +--- .../navigators/web/fixed-double-index.html | 21 ++- .../navigators/web/fixed-double-script.js | 2 +- .../navigators/web/fixed-double-script.js.map | 2 +- .../navigators/web/fixed-injectable-script.js | 2 +- .../web/fixed-injectable-script.js.map | 2 +- .../navigators/web/fixed-single-script.js | 2 +- .../navigators/web/fixed-single-script.js.map | 2 +- .../navigator/web/FixedWebNavigator.kt | 70 +++++-- .../navigator/web/FixedWebNavigatorState.kt | 49 +++-- .../navigator/web/layout/ReadingOrder.kt | 19 +- .../web/spread/DoubleViewportSpread.kt | 12 +- .../web/spread/SingleViewportSpread.kt | 12 +- .../navigator/web/spread/SpreadWebView.kt | 19 +- .../readium/navigator/web/util/DisplayArea.kt | 13 +- .../navigator/web/webapi/FixedDoubleApi.kt | 11 +- .../navigator/web/webapi/FixedSingleApi.kt | 11 +- .../navigator/web/webapi/GesturesApi.kt | 10 +- 44 files changed, 737 insertions(+), 180 deletions(-) create mode 100644 readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt create mode 100644 readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt create mode 100644 readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt delete mode 100644 readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt create mode 100644 readium/navigators/common/src/main/java/org/readium/navigator/common/Overflowable.kt create mode 100644 readium/navigators/common/src/main/java/org/readium/navigator/common/ReadingOrder.kt create mode 100644 readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/WebLauncher.kt create mode 100644 readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/ReadingOrder.kt diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt new file mode 100644 index 0000000000..ac2b3406f9 --- /dev/null +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt @@ -0,0 +1,84 @@ +package org.readium.navigator.common + +import androidx.activity.compose.BackHandler +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.Link +import org.readium.r2.shared.util.AbsoluteUrl +import org.readium.r2.shared.util.Url + +@ExperimentalReadiumApi +public interface HyperlinkListener { + + public fun onReadingOrderLinkActivated(url: Url, context: LinkContext?) + + public fun onResourceLinkActivated(url: Url, context: LinkContext?) + + public fun onExternalLinkActivated(url: AbsoluteUrl, context: LinkContext?) +} + +@ExperimentalReadiumApi +public sealed interface LinkContext + +/** + * @param noteContent Content of the footnote. Look at the [Link.mediaType] for the format + * of the footnote (e.g. HTML). + */ +@ExperimentalReadiumApi +public data class FootnoteContext( + public val noteContent: String +) : LinkContext + +@ExperimentalReadiumApi +@Composable +public fun defaultHyperlinkListener( + navigatorState: Navigator, + shouldFollowReadingOrderLink: (Url, LinkContext?) -> Boolean = { _, _ -> true }, + // shouldFollowResourceLink: (Url, LinkContext?) -> Boolean = { _, _ -> true }, + onExternalLinkActivated: (AbsoluteUrl, LinkContext?) -> Unit = { _, _ -> } +): HyperlinkListener { + val coroutineScope = rememberCoroutineScope() + val navigationHistory: MutableList = remember { mutableListOf() } + + BackHandler(enabled = navigationHistory.isNotEmpty()) { + val previousItem = navigationHistory.removeLast() + coroutineScope.launch { navigatorState.goTo(previousItem) } + } + + return DefaultHyperlinkListener( + coroutineScope = coroutineScope, + navigatorState = navigatorState, + navigationHistory = navigationHistory, + shouldFollowReadingOrderLink = shouldFollowReadingOrderLink, + onExternalLinkActivatedDelegate = onExternalLinkActivated + ) +} + +@ExperimentalReadiumApi +private class DefaultHyperlinkListener( + private val coroutineScope: CoroutineScope, + private val navigatorState: Navigator, + private val navigationHistory: MutableList, + private val shouldFollowReadingOrderLink: (Url, LinkContext?) -> Boolean, + private val onExternalLinkActivatedDelegate: (AbsoluteUrl, LinkContext?) -> Unit +) : HyperlinkListener { + + override fun onReadingOrderLinkActivated(url: Url, context: LinkContext?) { + if (shouldFollowReadingOrderLink(url, context)) { + val item = checkNotNull(navigatorState.readingOrder.indexOfHref(url)) + navigationHistory.add(item) + coroutineScope.launch { navigatorState.goTo(item) } + } + } + + override fun onResourceLinkActivated(url: Url, context: LinkContext?) { + } + + override fun onExternalLinkActivated(url: AbsoluteUrl, context: LinkContext?) { + onExternalLinkActivatedDelegate(url, context) + } +} diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt new file mode 100644 index 0000000000..ecaf0db01a --- /dev/null +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt @@ -0,0 +1,176 @@ +package org.readium.navigator.common + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.DpOffset +import androidx.compose.ui.unit.DpSize +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.max +import androidx.compose.ui.unit.times +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch +import org.readium.r2.navigator.preferences.ReadingProgression +import org.readium.r2.navigator.util.DirectionalNavigationAdapter +import org.readium.r2.shared.ExperimentalReadiumApi + +@ExperimentalReadiumApi +public interface InputListener { + /** + * Called when the user tapped the content, but nothing handled the event internally (eg. + * by following an internal link). + */ + public fun onTap(event: TapEvent, context: TapContext) +} + +/** + * Represents a tap event emitted by a navigator at the given [offset]. + * + * All the points are relative to the navigator view. + */ +@ExperimentalReadiumApi +public data class TapEvent( + val offset: DpOffset +) + +@ExperimentalReadiumApi +public data class TapContext( + val viewport: DpSize +) + +@ExperimentalReadiumApi +@Composable +public fun defaultInputListener( + navigatorState: T, + fallbackListener: InputListener? = null, + tapEdges: Set = setOf( + DirectionalNavigationAdapter.TapEdge.Horizontal + ), + handleTapsWhileScrolling: Boolean = false, + minimumHorizontalEdgeSize: Dp = 80.0.dp, + horizontalEdgeThresholdPercent: Double? = 0.3, + minimumVerticalEdgeSize: Dp = 80.0.dp, + verticalEdgeThresholdPercent: Double? = 0.3 +): InputListener where T : Navigator, T : Overflowable { + val coroutineScope = rememberCoroutineScope() + + return DefaultInputListener( + coroutineScope, + fallbackListener, + navigatorState, + tapEdges, + handleTapsWhileScrolling, + minimumHorizontalEdgeSize, + horizontalEdgeThresholdPercent, + minimumVerticalEdgeSize, + verticalEdgeThresholdPercent + ) +} + +@OptIn(ExperimentalReadiumApi::class) +private class DefaultInputListener( + private val coroutineScope: CoroutineScope, + private val fallbackListener: InputListener?, + private val navigatorState: T, + private val tapEdges: Set, + private val handleTapsWhileScrolling: Boolean, + private val minimumHorizontalEdgeSize: Dp, + private val horizontalEdgeThresholdPercent: Double?, + private val minimumVerticalEdgeSize: Dp, + private val verticalEdgeThresholdPercent: Double? +) : InputListener where T : Navigator, T : Overflowable { + + override fun onTap(event: TapEvent, context: TapContext) { + if (!handleTap(event, context)) { + fallbackListener?.onTap(event, context) + } + } + + private fun handleTap(event: TapEvent, context: TapContext): Boolean { + if (navigatorState.overflow.value.scroll && !handleTapsWhileScrolling) { + return false + } + + if (tapEdges.contains(DirectionalNavigationAdapter.TapEdge.Horizontal)) { + val width = context.viewport.width + + val horizontalEdgeSize = horizontalEdgeThresholdPercent?.let { + max(minimumHorizontalEdgeSize, it * width) + } ?: minimumHorizontalEdgeSize + val leftRange = 0.0.dp..horizontalEdgeSize + val rightRange = (width - horizontalEdgeSize)..width + + if (event.offset.x in rightRange && navigatorState.canMoveRight) { + coroutineScope.launch { navigatorState.goRight() } + return true + } else if (event.offset.x in leftRange && navigatorState.canMoveLeft) { + coroutineScope.launch { navigatorState.goLeft() } + return true + } + } + + if (tapEdges.contains(DirectionalNavigationAdapter.TapEdge.Vertical)) { + val height = context.viewport.height + + val verticalEdgeSize = verticalEdgeThresholdPercent?.let { + max(minimumVerticalEdgeSize, it * height) + } ?: minimumVerticalEdgeSize + val topRange = 0.0.dp..verticalEdgeSize + val bottomRange = (height - verticalEdgeSize)..height + + if (event.offset.y in bottomRange && navigatorState.canMoveForward) { + coroutineScope.launch { navigatorState.moveForward() } + return true + } else if (event.offset.y in topRange && navigatorState.canMoveBackward) { + coroutineScope.launch { navigatorState.moveBackward() } + return true + } + } + + return false + } + + private val Overflowable.canMoveLeft get() = + when (overflow.value.readingProgression) { + ReadingProgression.LTR -> + canMoveBackward + + ReadingProgression.RTL -> + canMoveForward + } + + private val Overflowable.canMoveRight get() = + when (overflow.value.readingProgression) { + ReadingProgression.LTR -> + canMoveForward + + ReadingProgression.RTL -> + canMoveBackward + } + + /** + * Moves to the left content portion (eg. page) relative to the reading progression direction. + */ + private suspend fun Overflowable.goLeft() { + return when (overflow.value.readingProgression) { + ReadingProgression.LTR -> + moveBackward() + + ReadingProgression.RTL -> + moveForward() + } + } + + /** + * Moves to the right content portion (eg. page) relative to the reading progression direction. + */ + private suspend fun Overflowable.goRight() { + return when (overflow.value.readingProgression) { + ReadingProgression.LTR -> + moveForward() + + ReadingProgression.RTL -> + moveBackward() + } + } +} diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt new file mode 100644 index 0000000000..6ccc1c63c1 --- /dev/null +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt @@ -0,0 +1,11 @@ +package org.readium.navigator.common + +import org.readium.r2.shared.ExperimentalReadiumApi + +@ExperimentalReadiumApi +public interface Navigator { + + public val readingOrder: R + + public suspend fun goTo(item: Int) +} diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt deleted file mode 100644 index 037e5ebe8e..0000000000 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.readium.navigator.common - -public interface NavigatorState diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/Overflowable.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/Overflowable.kt new file mode 100644 index 0000000000..88d84c66ba --- /dev/null +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/Overflowable.kt @@ -0,0 +1,35 @@ +package org.readium.navigator.common + +import androidx.compose.runtime.State +import org.readium.r2.shared.ExperimentalReadiumApi + +/** + * A view with content that can extend beyond the viewport. + * + * The user typically navigates through the viewport by scrolling or tapping its edges. + */ +@ExperimentalReadiumApi +public interface Overflowable { + + /** + * Current presentation rendered by the navigator. + */ + public val overflow: State + + public val canMoveForward: Boolean + + public val canMoveBackward: Boolean + + /** + * Moves to the next content portion (eg. page) in the reading progression direction. + */ + public suspend fun moveForward() + + /** + * Moves to the previous content portion (eg. page) in the reading progression direction. + */ + public suspend fun moveBackward() +} + +@ExperimentalReadiumApi +public typealias Overflow = org.readium.r2.navigator.OverflowableNavigator.Overflow diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/ReadingOrder.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/ReadingOrder.kt new file mode 100644 index 0000000000..a203fad909 --- /dev/null +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/ReadingOrder.kt @@ -0,0 +1,28 @@ +package org.readium.navigator.common + +import org.readium.r2.shared.DelicateReadiumApi +import org.readium.r2.shared.util.Url + +/** + * Data about the content to play. + */ +public interface ReadingOrder { + + /** + * List of items to play. + */ + public val items: List + + /** + * A piece of the content to play. + */ + public interface Item { + + public val href: Url + } + + @OptIn(DelicateReadiumApi::class) + public fun indexOfHref(href: Url): Int? = items + .indexOfFirst { it.href == href } + .takeUnless { it == -1 } +} diff --git a/readium/navigators/demo/build.gradle.kts b/readium/navigators/demo/build.gradle.kts index 1f2d5699cc..9cae3baeb5 100644 --- a/readium/navigators/demo/build.gradle.kts +++ b/readium/navigators/demo/build.gradle.kts @@ -77,4 +77,5 @@ dependencies { implementation(libs.androidx.fragment.ktx) implementation(libs.androidx.fragment.compose) implementation(libs.androidx.appcompat) + implementation(libs.androidx.browser) } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt index 08a19402c9..14b72c3bff 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt @@ -35,7 +35,7 @@ class DemoViewModel( ) : State data class Reader( - val readerState: ReaderState + val readerState: ReaderState<*> ) : State } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt index 5e39a2006f..52ff7a98a6 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt @@ -4,6 +4,8 @@ * available in the top-level LICENSE file of the project. */ +@file:OptIn(ExperimentalReadiumApi::class) + package org.readium.navigator.demo.reader import androidx.compose.animation.AnimatedVisibility @@ -24,24 +26,33 @@ import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.zIndex import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.cancel -import org.readium.navigator.common.NavigatorState +import org.readium.navigator.common.InputListener +import org.readium.navigator.common.Navigator +import org.readium.navigator.common.Overflowable +import org.readium.navigator.common.ReadingOrder +import org.readium.navigator.common.TapContext +import org.readium.navigator.common.TapEvent +import org.readium.navigator.common.defaultHyperlinkListener +import org.readium.navigator.common.defaultInputListener import org.readium.navigator.demo.preferences.UserPreferences import org.readium.navigator.demo.preferences.UserPreferencesViewModel +import org.readium.navigator.demo.util.launchWebBrowser import org.readium.navigator.pdf.PdfNavigator import org.readium.navigator.pdf.PdfNavigatorState import org.readium.navigator.web.FixedWebNavigator import org.readium.navigator.web.FixedWebNavigatorState -import org.readium.r2.navigator.input.TapEvent import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.Publication +import org.readium.r2.shared.util.toUri -data class ReaderState( +data class ReaderState( val coroutineScope: CoroutineScope, val publication: Publication, - val navigatorState: NavigatorState, + val navigatorState: Navigator, val preferencesViewModel: UserPreferencesViewModel<*, *> ) { @@ -53,8 +64,8 @@ data class ReaderState( @OptIn(ExperimentalMaterial3Api::class, ExperimentalReadiumApi::class) @Composable -fun Reader( - state: ReaderState, +fun Reader( + state: ReaderState, fullScreenState: MutableState ) { val showPreferences = remember { mutableStateOf(false) } @@ -79,23 +90,46 @@ fun Reader( onPreferencesActivated = { showPreferences.value = !showPreferences.value } ) - val onTap = remember(fullScreenState) { - { _: TapEvent -> fullScreenState.value = !fullScreenState.value } + val fallbackInputListener = remember { + object : InputListener { + override fun onTap(event: TapEvent, context: TapContext) { + fullScreenState.value = !fullScreenState.value + } + } } + val inputListener = + if (state.navigatorState is Overflowable) { + defaultInputListener( + navigatorState = state.navigatorState, + fallbackListener = fallbackInputListener + ) + } else { + fallbackInputListener + } + + val context = LocalContext.current + + val hyperlinkListener = + defaultHyperlinkListener( + navigatorState = state.navigatorState, + onExternalLinkActivated = { url, _ -> launchWebBrowser(context, url.toUri()) } + ) + when (state.navigatorState) { is FixedWebNavigatorState -> { FixedWebNavigator( modifier = Modifier.fillMaxSize(), state = state.navigatorState, - onTap = onTap + inputListener = inputListener, + hyperlinkListener = hyperlinkListener ) } is PdfNavigatorState<*, *> -> { PdfNavigator( modifier = Modifier.fillMaxSize(), state = state.navigatorState, - onTap = onTap + inputListener = inputListener ) } } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt index 60c3a00e82..f520bf2cd0 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt @@ -56,7 +56,7 @@ class ReaderOpener( private val pdfEngineProvider = PdfiumEngineProvider() - suspend fun open(url: AbsoluteUrl): Try { + suspend fun open(url: AbsoluteUrl): Try, Error> { val asset = assetRetriever.retrieve(url) .getOrElse { return Try.failure(it) } @@ -83,7 +83,7 @@ class ReaderOpener( private suspend fun createFixedWebReader( publication: Publication - ): Try { + ): Try, Error> { val navigatorFactory = FixedWebNavigatorFactory(application, publication) ?: return Try.failure(DebugError("Publication not supported")) @@ -121,7 +121,7 @@ class ReaderOpener( private fun createPdfReader( publication: Publication - ): Try { + ): Try, Error> { val navigatorFactory = PdfNavigatorFactory(publication, pdfEngineProvider) val initialPreferences = PdfiumPreferences() diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/WebLauncher.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/WebLauncher.kt new file mode 100644 index 0000000000..ef8fc5cb5e --- /dev/null +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/util/WebLauncher.kt @@ -0,0 +1,35 @@ +package org.readium.navigator.demo.util + +import android.content.ActivityNotFoundException +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.webkit.URLUtil +import androidx.browser.customtabs.CustomTabsIntent +import org.readium.r2.shared.InternalReadiumApi +import org.readium.r2.shared.extensions.tryOrLog + +/** + * Opens the given [uri] with a Chrome Custom Tab or the system browser as a fallback. + */ +@OptIn(InternalReadiumApi::class) +fun launchWebBrowser(context: Context, uri: Uri) { + var url = uri + if (url.scheme == null) { + url = url.buildUpon().scheme("http").build() + } + + if (!URLUtil.isNetworkUrl(url.toString())) { + return + } + + tryOrLog { + try { + CustomTabsIntent.Builder() + .build() + .launchUrl(context, url) + } catch (e: ActivityNotFoundException) { + context.startActivity(Intent(Intent.ACTION_VIEW, url)) + } + } +} diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigator.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigator.kt index 48d8567487..207c3c5b04 100644 --- a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigator.kt +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigator.kt @@ -8,6 +8,9 @@ import android.widget.FrameLayout import androidx.compose.runtime.Composable import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.DpOffset +import androidx.compose.ui.unit.DpSize +import androidx.compose.ui.unit.dp import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentContainerView import androidx.fragment.app.FragmentFactory @@ -17,9 +20,10 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import org.readium.navigator.common.InputListener import org.readium.navigator.common.Preferences import org.readium.navigator.common.Settings -import org.readium.r2.navigator.input.InputListener +import org.readium.navigator.common.TapContext import org.readium.r2.navigator.input.TapEvent import org.readium.r2.navigator.pdf.PdfNavigatorFactory import org.readium.r2.navigator.pdf.PdfNavigatorFragment @@ -31,7 +35,7 @@ import org.readium.r2.shared.publication.Locator public fun > PdfNavigator( modifier: Modifier = Modifier, state: PdfNavigatorState, - onTap: (TapEvent) -> Unit + inputListener: InputListener ) { val preferencesFlow = snapshotFlow { state.preferences.value } @@ -40,14 +44,20 @@ public fun > PdfNavigator( onUpdate = { val onFragmentCreated: (PdfNavigatorFragment) -> Unit = { fragment -> - val inputListener = - object : InputListener { + val legacyInputListener = + object : org.readium.r2.navigator.input.InputListener { override fun onTap(event: TapEvent): Boolean { - onTap.invoke(event) + val viewport = DpSize( + width = fragment.publicationView.width.toFloat().dp, + height = fragment.publicationView.height.toFloat().dp + ) + val offset = DpOffset(event.point.x.dp, event.point.y.dp) + val dpEvent = org.readium.navigator.common.TapEvent(offset) + inputListener.onTap(dpEvent, TapContext(viewport)) return true } } - fragment.addInputListener(inputListener) + fragment.addInputListener(legacyInputListener) fragment.currentLocator .onEach { locator -> diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt index e4c28b30f4..5d9888661d 100644 --- a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt @@ -26,6 +26,11 @@ public class PdfNavigatorFactory, E : Preferenc initialLocator: Locator? = null, initialPreferences: P? = null ): Try, Nothing> { + val readingOrder = + ReadingOrder( + publication.readingOrder.map { ReadingOrderItem(it.url()) } + ) + val actualInitialLocator = initialLocator ?: publication.locatorFromLink(publication.readingOrder[0])!! @@ -39,10 +44,16 @@ public class PdfNavigatorFactory, E : Preferenc pdfEngineProvider.computeSettings(publication.metadata, preferences) } + val overflowResolver = { settings: S -> + pdfEngineProvider.computeOverflow(settings) + } + val navigatorState = PdfNavigatorState( + readingOrder, legacyNavigatorFactory, settingsResolver, + overflowResolver, actualInitialLocator, actualInitialPreferences ) diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt index baf14f01e4..be3f78dcb5 100644 --- a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt @@ -6,7 +6,8 @@ import androidx.compose.runtime.State import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.mutableStateOf import org.readium.navigator.common.Configurable -import org.readium.navigator.common.NavigatorState +import org.readium.navigator.common.Navigator +import org.readium.navigator.common.Overflow import org.readium.navigator.common.Preferences import org.readium.navigator.common.Settings import org.readium.r2.navigator.pdf.PdfNavigatorFactory @@ -16,11 +17,13 @@ import org.readium.r2.shared.publication.Locator @ExperimentalReadiumApi @Stable public class PdfNavigatorState> internal constructor( + override val readingOrder: ReadingOrder, internal val pdfNavigatorFactory: PdfNavigatorFactory, private val settingsResolver: (P) -> S, - initialLocator: Locator, + private val overflowResolver: (S) -> Overflow, + private val initialLocator: Locator, initialPreferences: P -) : NavigatorState, Configurable { +) : Navigator, Configurable { // , Overflowable { override val preferences: MutableState

      = mutableStateOf(initialPreferences) @@ -30,4 +33,18 @@ public class PdfNavigatorState> internal constr internal val locator: MutableState = mutableStateOf(initialLocator) + + private val currentPage: Int get() = + locator.value.locations.position ?: initialLocator.locations.position ?: 0 + override suspend fun goTo(item: Int) { + throw NotImplementedError() + } + + /*@ExperimentalReadiumApi + public val overflow: State = + derivedStateOf { overflowResolver.invoke(settings.value) } + public val canMoveForward: Boolean + get() = currentPage < readingOrder.items[0].pageCount - 1 + public val canMoveBackward: Boolean + get() = currentPage > 0*/ } diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/ReadingOrder.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/ReadingOrder.kt new file mode 100644 index 0000000000..18cb293bd5 --- /dev/null +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/ReadingOrder.kt @@ -0,0 +1,12 @@ +package org.readium.navigator.pdf + +import org.readium.navigator.common.ReadingOrder +import org.readium.r2.shared.util.Url + +public data class ReadingOrder( + override val items: List +) : ReadingOrder + +public data class ReadingOrderItem( + override val href: Url +) : ReadingOrder.Item diff --git a/readium/navigators/web/scripts/dist/fixed-double-index.html b/readium/navigators/web/scripts/dist/fixed-double-index.html index cc3c0ad854..0a15204dda 100644 --- a/readium/navigators/web/scripts/dist/fixed-double-index.html +++ b/readium/navigators/web/scripts/dist/fixed-double-index.html @@ -26,6 +26,11 @@ border: none; background-color: white; } + .page-container { // container is useful for empty page background + display: inline-block; + border: none; + background-color: white; + } @@ -33,12 +38,16 @@ - - - + +
      - - - +
      +
      + +
      +
      +
      + +
      diff --git a/readium/navigators/web/scripts/dist/fixed-double-script.js b/readium/navigators/web/scripts/dist/fixed-double-script.js index 36cdcac9b7..7a962b418e 100644 --- a/readium/navigators/web/scripts/dist/fixed-double-script.js +++ b/readium/navigators/web/scripts/dist/fixed-double-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{console.log(`onmessage ${t}`),this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y?this.listener.onTap({x:t.data.x,y:t.data.y}):t.data.href&&this.listener.onLinkActivated(t.data.href)}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),h=parseFloat(i.get("height"));return n&&h?{width:n,height:h}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){console.log(`Constructing Gesturesdetector for window ${t}`),this.window=t,this.listener=e,document.addEventListener("click",(t=>{console.log("onClick"),this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):(console.log("tap detected"),this.listener.onTap(t)),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,h,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},new i(e,{onTap:t=>{a.onTap({x:t.clientX,y:t.clientY})},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{a.onTap(t)},onLinkActivated:t=>{a.onLinkActivated(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,n,o),this.metaViewport=h}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,n=Math.max(this.leftPage.size.height,this.rightPage.size.height),h={width:s,height:n},a={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,h,a);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(n).build(),this.leftPage.show(),this.rightPage.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const h=document.getElementById("page-left"),a=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,h,a){const o=new n(a);this.manager=new s(t,e,i,h,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,n,h){const a={width:t,height:e},o={top:i,left:h,bottom:n,right:s};this.manager.setViewport(a,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,h,a,o,window.gestures)}(); +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}),{once:!0})}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y?this.listener.onTap({x:t.data.x,y:t.data.y}):t.data.href&&this.listener.onLinkActivated(t.data.href)}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),a=parseFloat(i.get("height"));return n&&a?{width:n,height:a}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a,h){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};h.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}},r={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=n.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,n,r),this.metaViewport=a}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,n=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:n},h={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,a,h);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(n).build(),this.leftPage.show(),this.rightPage.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page-left"),h=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,a,h){const o=new n(h);this.manager=new s(t,e,i,a,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,o,window.gestures)}(); //# sourceMappingURL=fixed-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-double-script.js.map b/readium/navigators/web/scripts/dist/fixed-double-script.js.map index 2f60361fe2..4c767d157c 100644 --- a/readium/navigators/web/scripts/dist/fixed-double-script.js.map +++ b/readium/navigators/web/scripts/dist/fixed-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n console.log(`onmessage ${message}`);\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n else if (message.data.href) {\n this.listener.onLinkActivated(message.data.href);\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n console.log(\"tap detected\");\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a
      .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const wrapperGesturesListener = {\n onTap: (event) => {\n listener.onTap({ x: event.clientX, y: event.clientY });\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const pageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n listener.onTap(event);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, pageListener);\n this.rightPage = new PageManager(window, rightIframe, pageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","console","log","onMessageFromIframe","postMessage","port2","data","x","y","onTap","href","onLinkActivated","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","clientX","clientY","_","pageListener","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n }, { once: true });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n else if (message.data.href) {\n this.listener.onLinkActivated(message.data.href);\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const leftPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = leftIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n const rightPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = rightIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, leftPageListener);\n this.rightPage = new PageManager(window, rightIframe, rightPageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","once","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","onMessageFromIframe","postMessage","port2","data","x","y","onTap","href","onLinkActivated","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","leftPageListener","layout","boundingRect","getBoundingClientRect","rightPageListener","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-injectable-script.js b/readium/navigators/web/scripts/dist/fixed-injectable-script.js index cf62076439..5b4c9df605 100644 --- a/readium/navigators/web/scripts/dist/fixed-injectable-script.js +++ b/readium/navigators/web/scripts/dist/fixed-injectable-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class e{constructor(e,t){console.log(`Constructing Gesturesdetector for window ${e}`),this.window=e,this.listener=t,document.addEventListener("click",(e=>{console.log("onClick"),this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();if(t&&"Range"==t.type)return;let n;n=e.target instanceof HTMLElement?this.nearestInteractiveElement(e.target):null,n?n instanceof HTMLAnchorElement&&this.listener.onLinkActivated(n.href):(console.log("tap detected"),this.listener.onTap(e)),e.stopPropagation(),e.preventDefault()}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}window.addEventListener("message",(n=>{if(n.ports[0]){console.log("receiving port");const o=n.ports[0],s=new t(o);new e(window,s)}}));class t{constructor(e){this.messagePort=e}onTap(e){console.log("posting event");const t={x:e.clientX,y:e.clientY};this.messagePort.postMessage(t)}onLinkActivated(e){this.messagePort.postMessage({href:e})}}}(); +!function(){"use strict";class e{constructor(e,t){this.window=e,this.listener=t,document.addEventListener("click",(e=>{this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();if(t&&"Range"==t.type)return;let n;n=e.target instanceof HTMLElement?this.nearestInteractiveElement(e.target):null,n?n instanceof HTMLAnchorElement&&this.listener.onLinkActivated(n.href):this.listener.onTap(e),e.stopPropagation(),e.preventDefault()}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}window.addEventListener("message",(n=>{if(n.ports[0]){console.log("receiving port");const s=n.ports[0],i=new t(s);new e(window,i)}}));class t{constructor(e){this.messagePort=e}onTap(e){console.log("posting event");const t={x:e.clientX,y:e.clientY};this.messagePort.postMessage(t)}onLinkActivated(e){this.messagePort.postMessage({href:e})}}}(); //# sourceMappingURL=fixed-injectable-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map b/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map index 016031e632..ca0b2fafde 100644 --- a/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map +++ b/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAAO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAChBC,QAAQC,IAAI,4CAA4CH,KACxDI,KAAKJ,OAASA,EACdI,KAAKH,SAAWA,EAChBI,SAASC,iBAAiB,SAAUC,IAChCL,QAAQC,IAAI,WACZC,KAAKI,QAAQD,EAAM,IACpB,EAIP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKJ,OAAOW,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAN,EAAMO,kBAAkBC,YACPX,KAAKY,0BAA0BT,EAAMO,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1Bb,KAAKH,SAASiB,gBAAgBL,EAAeM,OAIjDjB,QAAQC,IAAI,gBACZC,KAAKH,SAASmB,MAAMb,IAExBA,EAAMc,kBACNd,EAAMe,gBACV,CAEA,yBAAAN,CAA0BO,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACDzB,KAAKY,0BAA0BO,EAAQM,eAE3C,IACX,EClEJ7B,OAAOM,iBAAiB,WAAYC,IAChC,GAAIA,EAAMuB,MAAM,GAAI,CAChB5B,QAAQC,IAAI,kBACZ,MAAM4B,EAAcxB,EAAMuB,MAAM,GAC1BE,EAAoB,IAAIC,EAA0BF,GACxD,IAAIjC,EAAiBE,OAAQgC,EACjC,KAEJ,MAAMC,EACF,WAAAlC,CAAYgC,GACR3B,KAAK2B,YAAcA,CACvB,CACA,KAAAX,CAAMb,GACFL,QAAQC,IAAI,iBACZ,MAAM+B,EAAW,CAAEC,EAAG5B,EAAM6B,QAASC,EAAG9B,EAAM+B,SAC9ClC,KAAK2B,YAAYQ,YAAYL,EACjC,CACA,eAAAhB,CAAgBC,GACZf,KAAK2B,YAAYQ,YAAY,CAAEpB,KAAMA,GACzC,E","sources":["webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/index-fixed-injectable.ts"],"sourcesContent":["export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n console.log(\"tap detected\");\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nwindow.addEventListener(\"message\", (event) => {\n if (event.ports[0]) {\n console.log(\"receiving port\");\n const messagePort = event.ports[0];\n const messagingListener = new MessagingGesturesListener(messagePort);\n new GesturesDetector(window, messagingListener);\n }\n});\nclass MessagingGesturesListener {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n onTap(event) {\n console.log(\"posting event\");\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.messagePort.postMessage(tapEvent);\n }\n onLinkActivated(href) {\n this.messagePort.postMessage({ href: href });\n }\n}\n"],"names":["GesturesDetector","constructor","window","listener","console","log","this","document","addEventListener","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","onLinkActivated","href","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","ports","messagePort","messagingListener","MessagingGesturesListener","tapEvent","x","clientX","y","clientY","postMessage"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAAO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBE,SAASC,iBAAiB,SAAUC,IAChCH,KAAKI,QAAQD,EAAM,IACpB,EACP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAN,EAAMO,kBAAkBC,YACPX,KAAKY,0BAA0BT,EAAMO,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1Bb,KAAKD,SAASe,gBAAgBL,EAAeM,MAIjDf,KAAKD,SAASiB,MAAMb,GAExBA,EAAMc,kBACNd,EAAMe,gBACV,CAEA,yBAAAN,CAA0BO,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACDzB,KAAKY,0BAA0BO,EAAQM,eAE3C,IACX,EC5DJ3B,OAAOI,iBAAiB,WAAYC,IAChC,GAAIA,EAAMuB,MAAM,GAAI,CAChBC,QAAQC,IAAI,kBACZ,MAAMC,EAAc1B,EAAMuB,MAAM,GAC1BI,EAAoB,IAAIC,EAA0BF,GACxD,IAAIjC,EAAiBE,OAAQgC,EACjC,KAEJ,MAAMC,EACF,WAAAlC,CAAYgC,GACR7B,KAAK6B,YAAcA,CACvB,CACA,KAAAb,CAAMb,GACFwB,QAAQC,IAAI,iBACZ,MAAMI,EAAW,CAAEC,EAAG9B,EAAM+B,QAASC,EAAGhC,EAAMiC,SAC9CpC,KAAK6B,YAAYQ,YAAYL,EACjC,CACA,eAAAlB,CAAgBC,GACZf,KAAK6B,YAAYQ,YAAY,CAAEtB,KAAMA,GACzC,E","sources":["webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/index-fixed-injectable.ts"],"sourcesContent":["export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nwindow.addEventListener(\"message\", (event) => {\n if (event.ports[0]) {\n console.log(\"receiving port\");\n const messagePort = event.ports[0];\n const messagingListener = new MessagingGesturesListener(messagePort);\n new GesturesDetector(window, messagingListener);\n }\n});\nclass MessagingGesturesListener {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n onTap(event) {\n console.log(\"posting event\");\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.messagePort.postMessage(tapEvent);\n }\n onLinkActivated(href) {\n this.messagePort.postMessage({ href: href });\n }\n}\n"],"names":["GesturesDetector","constructor","window","listener","this","document","addEventListener","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","onLinkActivated","href","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","ports","console","log","messagePort","messagingListener","MessagingGesturesListener","tapEvent","x","clientX","y","clientY","postMessage"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-single-script.js b/readium/navigators/web/scripts/dist/fixed-single-script.js index 8becbdf98f..5bef878855 100644 --- a/readium/navigators/web/scripts/dist/fixed-single-script.js +++ b/readium/navigators/web/scripts/dist/fixed-single-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{console.log(`onmessage ${t}`),this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y?this.listener.onTap({x:t.data.x,y:t.data.y}):t.data.href&&this.listener.onLinkActivated(t.data.href)}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),o=parseFloat(i.get("height"));return n&&o?{width:n,height:o}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){console.log(`Constructing Gesturesdetector for window ${t}`),this.window=t,this.listener=e,document.addEventListener("click",(t=>{console.log("onClick"),this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):(console.log("tap detected"),this.listener.onTap(t)),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,o){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,new i(e,{onTap:t=>{var i,s,a;console.log(`metaViewport ${n.content}`);const h=e.document.documentElement;console.log(`docElement ${h.scrollLeft} ${h.scrollTop}`),console.log(`scale ${null===(i=e.visualViewport)||void 0===i?void 0:i.scale}`),console.log(`visualviewport ${null===(s=e.visualViewport)||void 0===s?void 0:s.width} ${null===(a=e.visualViewport)||void 0===a?void 0:a.height}`);const l={x:t.clientX*this.scale/(e.visualViewport.scale*this.scale),y:t.clientY*this.scale/(e.visualViewport.scale*this.scale)};o.onTap(l)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}}),this.metaViewport=n;const a={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{var i,n,a;const h=e.document.documentElement;console.log(`docElement ${h.scrollLeft} ${h.scrollTop}`),console.log(`scale ${null===(i=e.visualViewport)||void 0===i?void 0:i.scale}`),console.log(`visualviewport ${null===(n=e.visualViewport)||void 0===n?void 0:n.width} ${null===(a=e.visualViewport)||void 0===a?void 0:a.height}`);const l=s.getBoundingClientRect();console.log(`boundingRect $} ${l.left} ${l.top}`);const r={x:(t.x+l.left)*this.scale/(e.visualViewport.scale*this.scale),y:(t.y+l.top)*this.scale/(e.visualViewport.scale*this.scale)};o.onTap(r)},onLinkActivated:t=>{o.onLinkActivated(t)}};this.page=new t(e,s,a)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const o=document.getElementById("page"),a=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,o){const a=new n(o);this.manager=new s(t,e,i,a)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,o){const a={width:t,height:e},h={top:i,left:o,bottom:n,right:s};this.manager.setViewport(a,h)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,o,a,window.gestures)}(); +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}),{once:!0})}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y?this.listener.onTap({x:t.data.x,y:t.data.y}):t.data.href&&this.listener.onLinkActivated(t.data.href)}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),a=parseFloat(i.get("height"));return n&&a?{width:n,height:a}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};a.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}}),this.metaViewport=n;const h={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};a.onTap(i)},onLinkActivated:t=>{a.onLinkActivated(t)}};this.page=new t(e,s,h)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page"),h=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,a){const h=new n(a);this.manager=new s(t,e,i,h)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,window.gestures)}(); //# sourceMappingURL=fixed-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-single-script.js.map b/readium/navigators/web/scripts/dist/fixed-single-script.js.map index 0dc919039b..f848f29406 100644 --- a/readium/navigators/web/scripts/dist/fixed-single-script.js.map +++ b/readium/navigators/web/scripts/dist/fixed-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-single-script.js","mappings":"yBACO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,EAAQC,GAGxB,GAFAC,KAAKC,QAAU,CAAEC,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GACpDL,KAAKM,QAAU,IAAIC,gBACdT,EAAOU,cACR,MAAMC,MAAM,mDAEhBT,KAAKD,SAAWA,EAChBC,KAAKF,OAASA,EACdE,KAAKF,OAAOY,iBAAiB,QAAQ,KACjCV,KAAKW,gBAAgB,GAE7B,CACA,IAAAC,GACIZ,KAAKF,OAAOe,MAAMC,QAAU,OAChC,CACA,IAAAC,GACIf,KAAKF,OAAOe,MAAMC,QAAU,MAChC,CAEA,UAAAE,CAAWf,GACHD,KAAKC,SAAWA,IAGpBD,KAAKF,OAAOe,MAAMI,UAAYjB,KAAKC,QAAQC,IAAM,KACjDF,KAAKF,OAAOe,MAAMK,WAAalB,KAAKC,QAAQI,KAAO,KACnDL,KAAKF,OAAOe,MAAMM,aAAenB,KAAKC,QAAQG,OAAS,KACvDJ,KAAKF,OAAOe,MAAMO,YAAcpB,KAAKC,QAAQE,MAAQ,KACzD,CAEA,QAAAkB,CAASC,GACLtB,KAAKF,OAAOyB,IAAMD,CACtB,CAEA,cAAAE,CAAeC,GACXzB,KAAKF,OAAOe,MAAMa,MAAQD,EAAKC,MAAQ,KACvC1B,KAAKF,OAAOe,MAAMc,OAASF,EAAKE,OAAS,KACzC3B,KAAKyB,KAAOA,CAChB,CACA,cAAAd,GACI,MAAMiB,EAAW5B,KAAKF,OAAOU,cAAcqB,SAASC,cAAc,uBAClE,IAAKF,GAAYA,aAAoBG,gBAEjC,OAEJ,MAAMC,EAAWhC,KAAKiC,cAAcL,GAC/BI,IAILhC,KAAKF,OAAOe,MAAMa,MAAQM,EAASN,MAAQ,KAC3C1B,KAAKF,OAAOe,MAAMc,OAASK,EAASL,OAAS,KAC7C3B,KAAKyB,KAAOO,EACZhC,KAAKM,QAAQ4B,MAAMC,UAAaC,IAC5BC,QAAQC,IAAI,aAAaF,KACzBpC,KAAKuC,oBAAoBH,EAAQ,EAErCpC,KAAKF,OAAOU,cAAcgC,YAAY,OAAQ,IAAK,CAACxC,KAAKM,QAAQmC,QACjEzC,KAAKD,SAASY,iBAClB,CACA,mBAAA4B,CAAoBH,GACZA,EAAQM,KAAKC,GAAKP,EAAQM,KAAKE,EAC/B5C,KAAKD,SAAS8C,MAAM,CAAEF,EAAGP,EAAQM,KAAKC,EAAGC,EAAGR,EAAQM,KAAKE,IAEpDR,EAAQM,KAAKI,MAClB9C,KAAKD,SAASgD,gBAAgBX,EAAQM,KAAKI,KAEnD,CAEA,aAAAb,CAAce,GACV,MAAMC,EAAQ,uBACRC,EAAa,IAAIC,IACvB,IAAIC,EACJ,KAAQA,EAAQH,EAAMI,KAAKL,EAAaM,UACvB,MAATF,GACAF,EAAWK,IAAIH,EAAM,GAAIA,EAAM,IAGvC,MAAM1B,EAAQ8B,WAAWN,EAAWO,IAAI,UAClC9B,EAAS6B,WAAWN,EAAWO,IAAI,WACzC,OAAI/B,GAASC,EACF,CAAED,QAAOC,eAGhB,CAER,ECvFG,MAAM+B,EACT,eAAAC,CAAgBC,GAEZ,OADA5D,KAAK6D,aAAeD,EACb5D,IACX,CACA,eAAA8D,CAAgBF,GAEZ,OADA5D,KAAK+D,aAAeH,EACb5D,IACX,CACA,QAAAgE,CAAStC,GAEL,OADA1B,KAAK0B,MAAQA,EACN1B,IACX,CACA,SAAAiE,CAAUtC,GAEN,OADA3B,KAAK2B,OAASA,EACP3B,IACX,CACA,KAAAkE,GACI,MAAMC,EAAa,GAanB,OAZInE,KAAK6D,cACLM,EAAWC,KAAK,iBAAmBpE,KAAK6D,cAExC7D,KAAK+D,cACLI,EAAWC,KAAK,iBAAmBpE,KAAK+D,cAExC/D,KAAK0B,OACLyC,EAAWC,KAAK,SAAWpE,KAAK0B,OAEhC1B,KAAK2B,QACLwC,EAAWC,KAAK,UAAYpE,KAAK2B,QAE9BwC,EAAWE,KAAK,KAC3B,EChCG,MAAMC,EACT,WAAA1E,CAAYC,EAAQE,GAChBsC,QAAQC,IAAI,4CAA4CzC,KACxDG,KAAKH,OAASA,EACdG,KAAKD,SAAWA,EAChB8B,SAASnB,iBAAiB,SAAU6D,IAChClC,QAAQC,IAAI,WACZtC,KAAKwE,QAAQD,EAAM,IACpB,EAIP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAY1E,KAAKH,OAAO8E,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAN,EAAMO,kBAAkBC,YACP/E,KAAKgF,0BAA0BT,EAAMO,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1BjF,KAAKD,SAASgD,gBAAgB8B,EAAe/B,OAIjDT,QAAQC,IAAI,gBACZtC,KAAKD,SAAS8C,MAAM0B,IAExBA,EAAMW,kBACNX,EAAMY,gBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACD1F,KAAKgF,0BAA0BI,EAAQM,eAE3C,IACX,ECvEG,MAAMC,EACT,WAAA/F,CAAYC,EAAQC,EAAQ8F,EAAc7F,GACtCC,KAAK6F,IAAM,UACX7F,KAAK8F,OAAS,CAAE5F,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GACnDL,KAAK4D,MAAQ,EAsBb,IAAIU,EAAiBzE,EArBW,CAC5BgD,MAAQ0B,IACJ,IAAIwB,EAAIC,EAAIC,EACZ5D,QAAQC,IAAI,gBAAgBsD,EAAatC,WACzC,MAAM4C,EAAarG,EAAOgC,SAASsE,gBACnC9D,QAAQC,IAAI,cAAc4D,EAAWE,cAAcF,EAAWG,aAC9DhE,QAAQC,IAAI,SAA0C,QAAhCyD,EAAKlG,EAAOyG,sBAAmC,IAAPP,OAAgB,EAASA,EAAGnC,SAC1FvB,QAAQC,IAAI,kBAAmD,QAAhC0D,EAAKnG,EAAOyG,sBAAmC,IAAPN,OAAgB,EAASA,EAAGtE,SAA0C,QAAhCuE,EAAKpG,EAAOyG,sBAAmC,IAAPL,OAAgB,EAASA,EAAGtE,UACjL,MAAM4E,EAAW,CACb5D,EAAI4B,EAAMiC,QAAUxG,KAAK4D,OACpB/D,EAAOyG,eAAe1C,MAAQ5D,KAAK4D,OACxChB,EAAI2B,EAAMkC,QAAUzG,KAAK4D,OACpB/D,EAAOyG,eAAe1C,MAAQ5D,KAAK4D,QAE5C7D,EAAS8C,MAAM0D,EAAS,EAG5BxD,gBAAkB2D,IACd,MAAMjG,MAAM,+CAA+C,IAInET,KAAK4F,aAAeA,EACpB,MAAMe,EAAe,CACjBhG,eAAgB,KACZX,KAAKW,gBAAgB,EAEzBkC,MAAQ0B,IACJ,IAAIwB,EAAIC,EAAIC,EACZ,MAAMC,EAAarG,EAAOgC,SAASsE,gBACnC9D,QAAQC,IAAI,cAAc4D,EAAWE,cAAcF,EAAWG,aAC9DhE,QAAQC,IAAI,SAA0C,QAAhCyD,EAAKlG,EAAOyG,sBAAmC,IAAPP,OAAgB,EAASA,EAAGnC,SAC1FvB,QAAQC,IAAI,kBAAmD,QAAhC0D,EAAKnG,EAAOyG,sBAAmC,IAAPN,OAAgB,EAASA,EAAGtE,SAA0C,QAAhCuE,EAAKpG,EAAOyG,sBAAmC,IAAPL,OAAgB,EAASA,EAAGtE,UACjL,MAAMiF,EAAe9G,EAAO+G,wBAC5BxE,QAAQC,IAAI,mBAAmBsE,EAAavG,QAAQuG,EAAa1G,OACjE,MAAMqG,EAAW,CACb5D,GAAK4B,EAAM5B,EAAIiE,EAAavG,MAAQL,KAAK4D,OACpC/D,EAAOyG,eAAe1C,MAAQ5D,KAAK4D,OACxChB,GAAK2B,EAAM3B,EAAIgE,EAAa1G,KAAOF,KAAK4D,OACnC/D,EAAOyG,eAAe1C,MAAQ5D,KAAK4D,QAE5C7D,EAAS8C,MAAM0D,EAAS,EAE5BxD,gBAAkBD,IACd/C,EAASgD,gBAAgBD,EAAK,GAGtC9C,KAAK8G,KAAO,IAAInH,EAAYE,EAAQC,EAAQ6G,EAChD,CACA,WAAAI,CAAYnF,EAAUkE,GACd9F,KAAK4B,UAAYA,GAAY5B,KAAK8F,QAAUA,IAGhD9F,KAAK4B,SAAWA,EAChB5B,KAAK8F,OAASA,EACd9F,KAAKgH,SACT,CACA,MAAAC,CAAOpB,GACC7F,KAAK6F,KAAOA,IAGhB7F,KAAK6F,IAAMA,EACX7F,KAAKgH,SACT,CACA,YAAAE,CAAa5F,GACTtB,KAAK8G,KAAK/F,OACVf,KAAK8G,KAAKzF,SAASC,EACvB,CACA,cAAAX,GACSX,KAAK8G,KAAKrF,MAIXzB,KAAKgH,QAEb,CACA,MAAAA,GACI,IAAKhH,KAAK8G,KAAKrF,OAASzB,KAAK4B,SACzB,OAEJ,MAAM3B,EAAU,CACZC,IAAKF,KAAK8F,OAAO5F,IACjBC,MAAOH,KAAK8F,OAAO3F,MACnBC,OAAQJ,KAAK8F,OAAO1F,OACpBC,KAAML,KAAK8F,OAAOzF,MAEtBL,KAAK8G,KAAK9F,WAAWf,GACrB,MAAMkH,EAAkB,CACpBzF,MAAO1B,KAAK4B,SAASF,MAAQ1B,KAAK8F,OAAOzF,KAAOL,KAAK8F,OAAO3F,MAC5DwB,OAAQ3B,KAAK4B,SAASD,OAAS3B,KAAK8F,OAAO5F,IAAMF,KAAK8F,OAAO1F,QAE3DwD,ECpGP,SAAsBiC,EAAKvC,EAAS8D,GACvC,OAAQvB,GACJ,IAAK,UACD,OAOZ,SAAoBvC,EAAS8D,GACzB,MAAMC,EAAaD,EAAU1F,MAAQ4B,EAAQ5B,MACvC4F,EAAcF,EAAUzF,OAAS2B,EAAQ3B,OAC/C,OAAO4F,KAAKC,IAAIH,EAAYC,EAChC,CAXmBG,CAAWnE,EAAS8D,GAC/B,IAAK,QACD,OAUZ,SAAkB9D,EAAS8D,GACvB,OAAOA,EAAU1F,MAAQ4B,EAAQ5B,KACrC,CAZmBgG,CAASpE,EAAS8D,GAC7B,IAAK,SACD,OAWZ,SAAmB9D,EAAS8D,GACxB,OAAOA,EAAUzF,OAAS2B,EAAQ3B,MACtC,CAbmBgG,CAAUrE,EAAS8D,GAEtC,CD2FsBQ,CAAa5H,KAAK6F,IAAK7F,KAAK8G,KAAKrF,KAAM0F,GACrDnH,KAAK4F,aAAatC,SAAU,IAAII,GAC3BC,gBAAgBC,GAChBE,gBAAgBF,GAChBI,SAAShE,KAAK8G,KAAKrF,KAAKC,OACxBuC,UAAUjE,KAAK8G,KAAKrF,KAAKE,QACzBuC,QACLlE,KAAK4D,MAAQA,EACb5D,KAAK8G,KAAKlG,MACd,EE7GG,MAAMiH,EACT,WAAAjI,CAAYkI,GACR9H,KAAK+H,UAAYD,CACrB,CACA,KAAAjF,CAAM0B,GACFvE,KAAK+H,UAAUlF,MAAMmF,KAAKC,UAAU1D,GACxC,CACA,eAAAxB,CAAgBD,GACZ9C,KAAK+H,UAAUhF,gBAAgBD,EACnC,ECHJ,MAAMhD,EAAS+B,SAASqG,eAAe,QACjCtC,EAAe/D,SAASC,cAAc,uBAC5CjC,OAAOsI,WAAa,ICNb,MACH,WAAAvI,CAAYC,EAAQC,EAAQ8F,EAAcwC,GACtC,MAAMrI,EAAW,IAAI8H,EAAsBO,GAC3CpI,KAAKqI,QAAU,IAAI1C,EAAkB9F,EAAQC,EAAQ8F,EAAc7F,EACvE,CACA,YAAAmH,CAAa5F,GACTtB,KAAKqI,QAAQnB,aAAa5F,EAC9B,CACA,WAAAyF,CAAYuB,EAAgBC,EAAgBC,EAAUC,EAAYC,EAAaC,GAC3E,MAAM/G,EAAW,CAAEF,MAAO4G,EAAgB3G,OAAQ4G,GAC5CzC,EAAS,CACX5F,IAAKsI,EACLnI,KAAMsI,EACNvI,OAAQsI,EACRvI,MAAOsI,GAEXzI,KAAKqI,QAAQtB,YAAYnF,EAAUkE,EACvC,CACA,MAAAmB,CAAOpB,GACH,GAAW,WAAPA,GAA2B,SAAPA,GAAyB,UAAPA,EACtC,MAAMpF,MAAM,sBAAsBoF,KAEtC7F,KAAKqI,QAAQpB,OAAOpB,EACxB,GDjBsChG,OAAQC,EAAQ8F,EAAc/F,OAAOuI,S","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n console.log(`onmessage ${message}`);\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n else if (message.data.href) {\n this.listener.onLinkActivated(message.data.href);\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n console.log(\"tap detected\");\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n const wrapperGesturesListener = {\n onTap: (event) => {\n var _a, _b, _c;\n console.log(`metaViewport ${metaViewport.content}`);\n const docElement = window.document.documentElement;\n console.log(`docElement ${docElement.scrollLeft} ${docElement.scrollTop}`);\n console.log(`scale ${(_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale}`);\n console.log(`visualviewport ${(_b = window.visualViewport) === null || _b === void 0 ? void 0 : _b.width} ${(_c = window.visualViewport) === null || _c === void 0 ? void 0 : _c.height}`);\n const tapEvent = {\n x: (event.clientX * this.scale) /\n (window.visualViewport.scale * this.scale),\n y: (event.clientY * this.scale) /\n (window.visualViewport.scale * this.scale),\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n var _a, _b, _c;\n const docElement = window.document.documentElement;\n console.log(`docElement ${docElement.scrollLeft} ${docElement.scrollTop}`);\n console.log(`scale ${(_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale}`);\n console.log(`visualviewport ${(_b = window.visualViewport) === null || _b === void 0 ? void 0 : _b.width} ${(_c = window.visualViewport) === null || _c === void 0 ? void 0 : _c.height}`);\n const boundingRect = iframe.getBoundingClientRect();\n console.log(`boundingRect $} ${boundingRect.left} ${boundingRect.top}`);\n const tapEvent = {\n x: ((event.x + boundingRect.left) * this.scale) /\n (window.visualViewport.scale * this.scale),\n y: ((event.y + boundingRect.top) * this.scale) /\n (window.visualViewport.scale * this.scale),\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","console","log","onMessageFromIframe","postMessage","port2","data","x","y","onTap","href","onLinkActivated","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","SingleAreaManager","metaViewport","fit","insets","_a","_b","_c","docElement","documentElement","scrollLeft","scrollTop","visualViewport","tapEvent","clientX","clientY","_","pageListener","boundingRect","getBoundingClientRect","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n }, { once: true });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n else if (message.data.href) {\n this.listener.onLinkActivated(message.data.href);\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n const boundingRect = iframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","once","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","onMessageFromIframe","postMessage","port2","data","x","y","onTap","href","onLinkActivated","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","SingleAreaManager","metaViewport","fit","insets","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","pageListener","boundingRect","getBoundingClientRect","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/public/fixed-double-index.html b/readium/navigators/web/scripts/public/fixed-double-index.html index cc3c0ad854..0a15204dda 100644 --- a/readium/navigators/web/scripts/public/fixed-double-index.html +++ b/readium/navigators/web/scripts/public/fixed-double-index.html @@ -26,6 +26,11 @@ border: none; background-color: white; } + .page-container { // container is useful for empty page background + display: inline-block; + border: none; + background-color: white; + } @@ -33,12 +38,16 @@ - - - + +
      - - - +
      +
      + +
      +
      +
      + +
      diff --git a/readium/navigators/web/scripts/src/common/gestures.ts b/readium/navigators/web/scripts/src/common/gestures.ts index 1cc49a7f24..00a7a31caa 100644 --- a/readium/navigators/web/scripts/src/common/gestures.ts +++ b/readium/navigators/web/scripts/src/common/gestures.ts @@ -9,20 +9,15 @@ export class GesturesDetector { private readonly window: Window constructor(window: Window, listener: GesturesListener) { - console.log(`Constructing Gesturesdetector for window ${window}`) this.window = window this.listener = listener document.addEventListener( "click", (event) => { - console.log("onClick") this.onClick(event) }, false ) - /*document.addEventListener("DOMContentLoaded", () => { - console.log("DOM content loaded") - })*/ } private onClick(event: MouseEvent) { @@ -50,7 +45,6 @@ export class GesturesDetector { this.listener.onLinkActivated(nearestElement.href) } } else { - console.log("tap detected") this.listener.onTap(event) } diff --git a/readium/navigators/web/scripts/src/fixed/double-area-manager.ts b/readium/navigators/web/scripts/src/fixed/double-area-manager.ts index f0fcd65270..601d263317 100644 --- a/readium/navigators/web/scripts/src/fixed/double-area-manager.ts +++ b/readium/navigators/web/scripts/src/fixed/double-area-manager.ts @@ -30,7 +30,14 @@ export class DoubleAreaManager { ) { const wrapperGesturesListener = { onTap: (event: MouseEvent) => { - listener.onTap({ x: event.clientX, y: event.clientY }) + const tapEvent = { + x: + (event.clientX - visualViewport!.offsetLeft) * + visualViewport!.scale, + y: + (event.clientY - visualViewport!.offsetTop) * visualViewport!.scale, + } + listener.onTap(tapEvent) }, // eslint-disable-next-line @typescript-eslint/no-unused-vars onLinkActivated: (_: string) => { @@ -39,19 +46,49 @@ export class DoubleAreaManager { } new GesturesDetector(window, wrapperGesturesListener) - const pageListener = { + const leftPageListener = { onIframeLoaded: () => { this.layout() }, onTap: (event: TapEvent) => { - listener.onTap(event) + const boundingRect = leftIframe.getBoundingClientRect() + const tapEvent = { + x: + (event.x + boundingRect.left - visualViewport!.offsetLeft) * + visualViewport!.scale, + y: + (event.y + boundingRect.top - visualViewport!.offsetTop) * + visualViewport!.scale, + } + listener.onTap(tapEvent) }, onLinkActivated: (href: string) => { listener.onLinkActivated(href) }, } - this.leftPage = new PageManager(window, leftIframe, pageListener) - this.rightPage = new PageManager(window, rightIframe, pageListener) + + const rightPageListener = { + onIframeLoaded: () => { + this.layout() + }, + onTap: (event: TapEvent) => { + const boundingRect = rightIframe.getBoundingClientRect() + const tapEvent = { + x: + (event.x + boundingRect.left - visualViewport!.offsetLeft) * + visualViewport!.scale, + y: + (event.y + boundingRect.top - visualViewport!.offsetTop) * + visualViewport!.scale, + } + listener.onTap(tapEvent) + }, + onLinkActivated: (href: string) => { + listener.onLinkActivated(href) + }, + } + this.leftPage = new PageManager(window, leftIframe, leftPageListener) + this.rightPage = new PageManager(window, rightIframe, rightPageListener) this.metaViewport = metaViewport } diff --git a/readium/navigators/web/scripts/src/fixed/page-manager.ts b/readium/navigators/web/scripts/src/fixed/page-manager.ts index 892e3d9c15..2926ccb78e 100644 --- a/readium/navigators/web/scripts/src/fixed/page-manager.ts +++ b/readium/navigators/web/scripts/src/fixed/page-manager.ts @@ -24,9 +24,13 @@ export class PageManager { this.listener = listener this.iframe = iframe - this.iframe.addEventListener("load", () => { - this.onIframeLoaded() - }) + this.iframe.addEventListener( + "load", + () => { + this.onIframeLoaded() + }, + { once: true } + ) } show() { @@ -56,6 +60,7 @@ export class PageManager { /** Sets the size of this page without content. */ setPlaceholder(size: Size) { + this.iframe.style.visibility = "hidden" this.iframe.style.width = size.width + "px" this.iframe.style.height = size.height + "px" this.size = size @@ -80,7 +85,6 @@ export class PageManager { this.size = pageSize this.channel.port1.onmessage = (message) => { - console.log(`onmessage ${message}`) this.onMessageFromIframe(message) } this.iframe.contentWindow!.postMessage("Init", "*", [this.channel.port2]) diff --git a/readium/navigators/web/scripts/src/fixed/single-area-manager.ts b/readium/navigators/web/scripts/src/fixed/single-area-manager.ts index af9c863f89..92fe435e73 100644 --- a/readium/navigators/web/scripts/src/fixed/single-area-manager.ts +++ b/readium/navigators/web/scripts/src/fixed/single-area-manager.ts @@ -27,23 +27,12 @@ export class SingleAreaManager { ) { const wrapperGesturesListener = { onTap: (event: MouseEvent) => { - console.log(`metaViewport ${metaViewport.content}`) - const docElement = window.document.documentElement - console.log( - `docElement ${docElement.scrollLeft} ${docElement.scrollTop}` - ) - console.log(`scale ${window.visualViewport?.scale}`) - console.log( - `visualviewport ${window.visualViewport?.width} ${window.visualViewport?.height}` - ) - const tapEvent = { x: - (event.clientX * this.scale) / - (window.visualViewport!.scale * this.scale), + (event.clientX - visualViewport!.offsetLeft) * + visualViewport!.scale, y: - (event.clientY * this.scale) / - (window.visualViewport!.scale * this.scale), + (event.clientY - visualViewport!.offsetTop) * visualViewport!.scale, } listener.onTap(tapEvent) }, @@ -60,23 +49,14 @@ export class SingleAreaManager { this.onIframeLoaded() }, onTap: (event: TapEvent) => { - const docElement = window.document.documentElement - console.log( - `docElement ${docElement.scrollLeft} ${docElement.scrollTop}` - ) - console.log(`scale ${window.visualViewport?.scale}`) - console.log( - `visualviewport ${window.visualViewport?.width} ${window.visualViewport?.height}` - ) const boundingRect = iframe.getBoundingClientRect() - console.log(`boundingRect $} ${boundingRect.left} ${boundingRect.top}`) const tapEvent = { x: - ((event.x + boundingRect.left) * this.scale) / - (window.visualViewport!.scale * this.scale), + (event.x + boundingRect.left - visualViewport!.offsetLeft) * + visualViewport!.scale, y: - ((event.y + boundingRect.top) * this.scale) / - (window.visualViewport!.scale * this.scale), + (event.y + boundingRect.top - visualViewport!.offsetTop) * + visualViewport!.scale, } listener.onTap(tapEvent) }, @@ -136,7 +116,9 @@ export class SingleAreaManager { width: this.viewport.width - this.insets.left - this.insets.right, height: this.viewport.height - this.insets.top - this.insets.bottom, } + const scale = computeScale(this.fit, this.page.size, safeDrawingSize) + this.metaViewport.content = new ViewportStringBuilder() .setInitialScale(scale) .setMinimumScale(scale) diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-index.html b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-index.html index cc3c0ad854..0a15204dda 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-index.html +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-index.html @@ -26,6 +26,11 @@ border: none; background-color: white; } + .page-container { // container is useful for empty page background + display: inline-block; + border: none; + background-color: white; + } @@ -33,12 +38,16 @@ - - - + +
      - - - +
      +
      + +
      +
      +
      + +
      diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js index 36cdcac9b7..7a962b418e 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{console.log(`onmessage ${t}`),this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y?this.listener.onTap({x:t.data.x,y:t.data.y}):t.data.href&&this.listener.onLinkActivated(t.data.href)}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),h=parseFloat(i.get("height"));return n&&h?{width:n,height:h}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){console.log(`Constructing Gesturesdetector for window ${t}`),this.window=t,this.listener=e,document.addEventListener("click",(t=>{console.log("onClick"),this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):(console.log("tap detected"),this.listener.onTap(t)),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,h,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},new i(e,{onTap:t=>{a.onTap({x:t.clientX,y:t.clientY})},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{a.onTap(t)},onLinkActivated:t=>{a.onLinkActivated(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,n,o),this.metaViewport=h}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,n=Math.max(this.leftPage.size.height,this.rightPage.size.height),h={width:s,height:n},a={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,h,a);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(n).build(),this.leftPage.show(),this.rightPage.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const h=document.getElementById("page-left"),a=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,h,a){const o=new n(a);this.manager=new s(t,e,i,h,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,n,h){const a={width:t,height:e},o={top:i,left:h,bottom:n,right:s};this.manager.setViewport(a,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,h,a,o,window.gestures)}(); +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}),{once:!0})}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y?this.listener.onTap({x:t.data.x,y:t.data.y}):t.data.href&&this.listener.onLinkActivated(t.data.href)}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),a=parseFloat(i.get("height"));return n&&a?{width:n,height:a}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a,h){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};h.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}},r={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=n.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,n,r),this.metaViewport=a}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,n=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:n},h={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,a,h);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(n).build(),this.leftPage.show(),this.rightPage.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page-left"),h=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,a,h){const o=new n(h);this.manager=new s(t,e,i,a,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,o,window.gestures)}(); //# sourceMappingURL=fixed-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map index 2f60361fe2..4c767d157c 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n console.log(`onmessage ${message}`);\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n else if (message.data.href) {\n this.listener.onLinkActivated(message.data.href);\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n console.log(\"tap detected\");\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a
      .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const wrapperGesturesListener = {\n onTap: (event) => {\n listener.onTap({ x: event.clientX, y: event.clientY });\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const pageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n listener.onTap(event);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, pageListener);\n this.rightPage = new PageManager(window, rightIframe, pageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","console","log","onMessageFromIframe","postMessage","port2","data","x","y","onTap","href","onLinkActivated","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","clientX","clientY","_","pageListener","layout","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n }, { once: true });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n else if (message.data.href) {\n this.listener.onLinkActivated(message.data.href);\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const leftPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = leftIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n const rightPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = rightIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, leftPageListener);\n this.rightPage = new PageManager(window, rightIframe, rightPageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","once","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","onMessageFromIframe","postMessage","port2","data","x","y","onTap","href","onLinkActivated","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","leftPageListener","layout","boundingRect","getBoundingClientRect","rightPageListener","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js index cf62076439..5b4c9df605 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class e{constructor(e,t){console.log(`Constructing Gesturesdetector for window ${e}`),this.window=e,this.listener=t,document.addEventListener("click",(e=>{console.log("onClick"),this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();if(t&&"Range"==t.type)return;let n;n=e.target instanceof HTMLElement?this.nearestInteractiveElement(e.target):null,n?n instanceof HTMLAnchorElement&&this.listener.onLinkActivated(n.href):(console.log("tap detected"),this.listener.onTap(e)),e.stopPropagation(),e.preventDefault()}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}window.addEventListener("message",(n=>{if(n.ports[0]){console.log("receiving port");const o=n.ports[0],s=new t(o);new e(window,s)}}));class t{constructor(e){this.messagePort=e}onTap(e){console.log("posting event");const t={x:e.clientX,y:e.clientY};this.messagePort.postMessage(t)}onLinkActivated(e){this.messagePort.postMessage({href:e})}}}(); +!function(){"use strict";class e{constructor(e,t){this.window=e,this.listener=t,document.addEventListener("click",(e=>{this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();if(t&&"Range"==t.type)return;let n;n=e.target instanceof HTMLElement?this.nearestInteractiveElement(e.target):null,n?n instanceof HTMLAnchorElement&&this.listener.onLinkActivated(n.href):this.listener.onTap(e),e.stopPropagation(),e.preventDefault()}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}window.addEventListener("message",(n=>{if(n.ports[0]){console.log("receiving port");const s=n.ports[0],i=new t(s);new e(window,i)}}));class t{constructor(e){this.messagePort=e}onTap(e){console.log("posting event");const t={x:e.clientX,y:e.clientY};this.messagePort.postMessage(t)}onLinkActivated(e){this.messagePort.postMessage({href:e})}}}(); //# sourceMappingURL=fixed-injectable-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map index 016031e632..ca0b2fafde 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAAO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAChBC,QAAQC,IAAI,4CAA4CH,KACxDI,KAAKJ,OAASA,EACdI,KAAKH,SAAWA,EAChBI,SAASC,iBAAiB,SAAUC,IAChCL,QAAQC,IAAI,WACZC,KAAKI,QAAQD,EAAM,IACpB,EAIP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKJ,OAAOW,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAN,EAAMO,kBAAkBC,YACPX,KAAKY,0BAA0BT,EAAMO,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1Bb,KAAKH,SAASiB,gBAAgBL,EAAeM,OAIjDjB,QAAQC,IAAI,gBACZC,KAAKH,SAASmB,MAAMb,IAExBA,EAAMc,kBACNd,EAAMe,gBACV,CAEA,yBAAAN,CAA0BO,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACDzB,KAAKY,0BAA0BO,EAAQM,eAE3C,IACX,EClEJ7B,OAAOM,iBAAiB,WAAYC,IAChC,GAAIA,EAAMuB,MAAM,GAAI,CAChB5B,QAAQC,IAAI,kBACZ,MAAM4B,EAAcxB,EAAMuB,MAAM,GAC1BE,EAAoB,IAAIC,EAA0BF,GACxD,IAAIjC,EAAiBE,OAAQgC,EACjC,KAEJ,MAAMC,EACF,WAAAlC,CAAYgC,GACR3B,KAAK2B,YAAcA,CACvB,CACA,KAAAX,CAAMb,GACFL,QAAQC,IAAI,iBACZ,MAAM+B,EAAW,CAAEC,EAAG5B,EAAM6B,QAASC,EAAG9B,EAAM+B,SAC9ClC,KAAK2B,YAAYQ,YAAYL,EACjC,CACA,eAAAhB,CAAgBC,GACZf,KAAK2B,YAAYQ,YAAY,CAAEpB,KAAMA,GACzC,E","sources":["webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/index-fixed-injectable.ts"],"sourcesContent":["export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n console.log(\"tap detected\");\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nwindow.addEventListener(\"message\", (event) => {\n if (event.ports[0]) {\n console.log(\"receiving port\");\n const messagePort = event.ports[0];\n const messagingListener = new MessagingGesturesListener(messagePort);\n new GesturesDetector(window, messagingListener);\n }\n});\nclass MessagingGesturesListener {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n onTap(event) {\n console.log(\"posting event\");\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.messagePort.postMessage(tapEvent);\n }\n onLinkActivated(href) {\n this.messagePort.postMessage({ href: href });\n }\n}\n"],"names":["GesturesDetector","constructor","window","listener","console","log","this","document","addEventListener","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","onLinkActivated","href","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","ports","messagePort","messagingListener","MessagingGesturesListener","tapEvent","x","clientX","y","clientY","postMessage"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAAO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBE,SAASC,iBAAiB,SAAUC,IAChCH,KAAKI,QAAQD,EAAM,IACpB,EACP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAN,EAAMO,kBAAkBC,YACPX,KAAKY,0BAA0BT,EAAMO,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1Bb,KAAKD,SAASe,gBAAgBL,EAAeM,MAIjDf,KAAKD,SAASiB,MAAMb,GAExBA,EAAMc,kBACNd,EAAMe,gBACV,CAEA,yBAAAN,CAA0BO,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACDzB,KAAKY,0BAA0BO,EAAQM,eAE3C,IACX,EC5DJ3B,OAAOI,iBAAiB,WAAYC,IAChC,GAAIA,EAAMuB,MAAM,GAAI,CAChBC,QAAQC,IAAI,kBACZ,MAAMC,EAAc1B,EAAMuB,MAAM,GAC1BI,EAAoB,IAAIC,EAA0BF,GACxD,IAAIjC,EAAiBE,OAAQgC,EACjC,KAEJ,MAAMC,EACF,WAAAlC,CAAYgC,GACR7B,KAAK6B,YAAcA,CACvB,CACA,KAAAb,CAAMb,GACFwB,QAAQC,IAAI,iBACZ,MAAMI,EAAW,CAAEC,EAAG9B,EAAM+B,QAASC,EAAGhC,EAAMiC,SAC9CpC,KAAK6B,YAAYQ,YAAYL,EACjC,CACA,eAAAlB,CAAgBC,GACZf,KAAK6B,YAAYQ,YAAY,CAAEtB,KAAMA,GACzC,E","sources":["webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/index-fixed-injectable.ts"],"sourcesContent":["export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nwindow.addEventListener(\"message\", (event) => {\n if (event.ports[0]) {\n console.log(\"receiving port\");\n const messagePort = event.ports[0];\n const messagingListener = new MessagingGesturesListener(messagePort);\n new GesturesDetector(window, messagingListener);\n }\n});\nclass MessagingGesturesListener {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n onTap(event) {\n console.log(\"posting event\");\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.messagePort.postMessage(tapEvent);\n }\n onLinkActivated(href) {\n this.messagePort.postMessage({ href: href });\n }\n}\n"],"names":["GesturesDetector","constructor","window","listener","this","document","addEventListener","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","onLinkActivated","href","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","ports","console","log","messagePort","messagingListener","MessagingGesturesListener","tapEvent","x","clientX","y","clientY","postMessage"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js index 8becbdf98f..5bef878855 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}))}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{console.log(`onmessage ${t}`),this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y?this.listener.onTap({x:t.data.x,y:t.data.y}):t.data.href&&this.listener.onLinkActivated(t.data.href)}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),o=parseFloat(i.get("height"));return n&&o?{width:n,height:o}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){console.log(`Constructing Gesturesdetector for window ${t}`),this.window=t,this.listener=e,document.addEventListener("click",(t=>{console.log("onClick"),this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):(console.log("tap detected"),this.listener.onTap(t)),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,o){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,new i(e,{onTap:t=>{var i,s,a;console.log(`metaViewport ${n.content}`);const h=e.document.documentElement;console.log(`docElement ${h.scrollLeft} ${h.scrollTop}`),console.log(`scale ${null===(i=e.visualViewport)||void 0===i?void 0:i.scale}`),console.log(`visualviewport ${null===(s=e.visualViewport)||void 0===s?void 0:s.width} ${null===(a=e.visualViewport)||void 0===a?void 0:a.height}`);const l={x:t.clientX*this.scale/(e.visualViewport.scale*this.scale),y:t.clientY*this.scale/(e.visualViewport.scale*this.scale)};o.onTap(l)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}}),this.metaViewport=n;const a={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{var i,n,a;const h=e.document.documentElement;console.log(`docElement ${h.scrollLeft} ${h.scrollTop}`),console.log(`scale ${null===(i=e.visualViewport)||void 0===i?void 0:i.scale}`),console.log(`visualviewport ${null===(n=e.visualViewport)||void 0===n?void 0:n.width} ${null===(a=e.visualViewport)||void 0===a?void 0:a.height}`);const l=s.getBoundingClientRect();console.log(`boundingRect $} ${l.left} ${l.top}`);const r={x:(t.x+l.left)*this.scale/(e.visualViewport.scale*this.scale),y:(t.y+l.top)*this.scale/(e.visualViewport.scale*this.scale)};o.onTap(r)},onLinkActivated:t=>{o.onLinkActivated(t)}};this.page=new t(e,s,a)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const o=document.getElementById("page"),a=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,o){const a=new n(o);this.manager=new s(t,e,i,a)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,o){const a={width:t,height:e},h={top:i,left:o,bottom:n,right:s};this.manager.setViewport(a,h)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,o,a,window.gestures)}(); +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}),{once:!0})}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y?this.listener.onTap({x:t.data.x,y:t.data.y}):t.data.href&&this.listener.onLinkActivated(t.data.href)}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),a=parseFloat(i.get("height"));return n&&a?{width:n,height:a}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};a.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}}),this.metaViewport=n;const h={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};a.onTap(i)},onLinkActivated:t=>{a.onLinkActivated(t)}};this.page=new t(e,s,h)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page"),h=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,a){const h=new n(a);this.manager=new s(t,e,i,h)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,window.gestures)}(); //# sourceMappingURL=fixed-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map index 0dc919039b..f848f29406 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n console.log(`onmessage ${message}`);\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n else if (message.data.href) {\n this.listener.onLinkActivated(message.data.href);\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n console.log(`Constructing Gesturesdetector for window ${window}`);\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n console.log(\"onClick\");\n this.onClick(event);\n }, false);\n /*document.addEventListener(\"DOMContentLoaded\", () => {\n console.log(\"DOM content loaded\")\n })*/\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n console.log(\"tap detected\");\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n const wrapperGesturesListener = {\n onTap: (event) => {\n var _a, _b, _c;\n console.log(`metaViewport ${metaViewport.content}`);\n const docElement = window.document.documentElement;\n console.log(`docElement ${docElement.scrollLeft} ${docElement.scrollTop}`);\n console.log(`scale ${(_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale}`);\n console.log(`visualviewport ${(_b = window.visualViewport) === null || _b === void 0 ? void 0 : _b.width} ${(_c = window.visualViewport) === null || _c === void 0 ? void 0 : _c.height}`);\n const tapEvent = {\n x: (event.clientX * this.scale) /\n (window.visualViewport.scale * this.scale),\n y: (event.clientY * this.scale) /\n (window.visualViewport.scale * this.scale),\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n var _a, _b, _c;\n const docElement = window.document.documentElement;\n console.log(`docElement ${docElement.scrollLeft} ${docElement.scrollTop}`);\n console.log(`scale ${(_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale}`);\n console.log(`visualviewport ${(_b = window.visualViewport) === null || _b === void 0 ? void 0 : _b.width} ${(_c = window.visualViewport) === null || _c === void 0 ? void 0 : _c.height}`);\n const boundingRect = iframe.getBoundingClientRect();\n console.log(`boundingRect $} ${boundingRect.left} ${boundingRect.top}`);\n const tapEvent = {\n x: ((event.x + boundingRect.left) * this.scale) /\n (window.visualViewport.scale * this.scale),\n y: ((event.y + boundingRect.top) * this.scale) /\n (window.visualViewport.scale * this.scale),\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","console","log","onMessageFromIframe","postMessage","port2","data","x","y","onTap","href","onLinkActivated","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","SingleAreaManager","metaViewport","fit","insets","_a","_b","_c","docElement","documentElement","scrollLeft","scrollTop","visualViewport","tapEvent","clientX","clientY","_","pageListener","boundingRect","getBoundingClientRect","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n }, { once: true });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n else if (message.data.href) {\n this.listener.onLinkActivated(message.data.href);\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n const boundingRect = iframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","once","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","onMessageFromIframe","postMessage","port2","data","x","y","onTap","href","onLinkActivated","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","SingleAreaManager","metaViewport","fit","insets","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","pageListener","boundingRect","getBoundingClientRect","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt index 0b74b0f027..7a96c3ff61 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt @@ -9,12 +9,19 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Modifier -import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.LayoutDirection +import org.readium.navigator.common.HyperlinkListener +import org.readium.navigator.common.InputListener +import org.readium.navigator.common.LinkContext +import org.readium.navigator.common.TapContext +import org.readium.navigator.common.defaultHyperlinkListener +import org.readium.navigator.common.defaultInputListener import org.readium.navigator.web.layout.DoubleViewportSpread +import org.readium.navigator.web.layout.ReadingOrder import org.readium.navigator.web.layout.SingleViewportSpread import org.readium.navigator.web.pager.NavigatorPager import org.readium.navigator.web.spread.DoubleSpreadState @@ -24,32 +31,29 @@ import org.readium.navigator.web.spread.SingleViewportSpread import org.readium.navigator.web.util.AbsolutePaddingValues import org.readium.navigator.web.util.DisplayArea import org.readium.navigator.web.util.WebViewServer -import org.readium.r2.navigator.input.TapEvent import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.util.AbsoluteUrl +import org.readium.r2.shared.util.RelativeUrl +import org.readium.r2.shared.util.Url @ExperimentalReadiumApi @Composable public fun FixedWebNavigator( modifier: Modifier = Modifier, - displayCutout: WindowInsets = WindowInsets.displayCutout, + state: FixedWebNavigatorState, + windowInsets: WindowInsets = WindowInsets.displayCutout, backgroundColor: Color = MaterialTheme.colorScheme.background, - onTap: (TapEvent) -> Unit = {}, - state: FixedWebNavigatorState + inputListener: InputListener = defaultInputListener(navigatorState = state), + hyperlinkListener: HyperlinkListener = defaultHyperlinkListener(navigatorState = state) ) { BoxWithConstraints( modifier = Modifier.fillMaxSize(), propagateMinConstraints = true ) { - val viewportSize = Size(maxWidth.value, maxHeight.value) - - val safeDrawingPadding = AbsolutePaddingValues( - top = displayCutout.getTop(LocalDensity.current), - right = displayCutout.getRight(LocalDensity.current, LocalLayoutDirection.current), - bottom = displayCutout.getBottom(LocalDensity.current), - left = displayCutout.getLeft(LocalDensity.current, LocalLayoutDirection.current) - ) + val viewportSize = DpSize(maxWidth, maxHeight) + val safeDrawingPadding = windowInsets.asAbsolutePaddingValues() val displayArea = rememberUpdatedState(DisplayArea(viewportSize, safeDrawingPadding)) val reverseLayout = @@ -76,9 +80,9 @@ public fun FixedWebNavigator( } SingleViewportSpread( - onTap = onTap, - onLinkActivated = { url -> - state.readingOrder.indexOfHref(url)?.let { state.goToSync(it) } + onTap = { inputListener.onTap(it, TapContext(viewportSize)) }, + onLinkActivated = { url, context -> + onLinkActivated(url, context, state.readingOrder, hyperlinkListener) }, state = spreadState, backgroundColor = backgroundColor @@ -97,9 +101,9 @@ public fun FixedWebNavigator( } DoubleViewportSpread( - onTap = onTap, - onLinkActivated = { url -> - state.readingOrder.indexOfHref(url)?.let { state.goToSync(it) } + onTap = { inputListener.onTap(it, TapContext(viewportSize)) }, + onLinkActivated = { url, context -> + onLinkActivated(url, context, state.readingOrder, hyperlinkListener) }, state = spreadState, backgroundColor = backgroundColor @@ -110,9 +114,37 @@ public fun FixedWebNavigator( } } +@Composable +private fun WindowInsets.asAbsolutePaddingValues(): AbsolutePaddingValues { + val density = LocalDensity.current + val layoutDirection = LocalLayoutDirection.current + val top = with(density) { getTop(density).toDp() } + val right = with(density) { getRight(density, layoutDirection).toDp() } + val bottom = with(density) { getBottom(density).toDp() } + val left = with(density) { getLeft(density, layoutDirection).toDp() } + return AbsolutePaddingValues(top = top, right = right, bottom = bottom, left = left) +} + @OptIn(ExperimentalReadiumApi::class) private fun LayoutDirection.toReadingProgression(): ReadingProgression = when (this) { LayoutDirection.Ltr -> ReadingProgression.LTR LayoutDirection.Rtl -> ReadingProgression.RTL } + +@OptIn(ExperimentalReadiumApi::class) +private fun onLinkActivated( + url: Url, + context: LinkContext?, + readingOrder: ReadingOrder, + listener: HyperlinkListener +) { + readingOrder.indexOfHref(url) + ?.let { listener.onReadingOrderLinkActivated(url, context) } + ?: run { + when (url) { + is RelativeUrl -> listener.onResourceLinkActivated(url, context) + is AbsoluteUrl -> listener.onExternalLinkActivated(url, context) + } + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt index 585848b36f..302ac4631e 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt @@ -8,11 +8,10 @@ import androidx.compose.runtime.Stable import androidx.compose.runtime.State import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.mutableStateOf -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.launch import org.readium.navigator.common.Configurable -import org.readium.navigator.common.NavigatorState +import org.readium.navigator.common.Navigator +import org.readium.navigator.common.Overflow +import org.readium.navigator.common.Overflowable import org.readium.navigator.web.layout.Layout import org.readium.navigator.web.layout.LayoutResolver import org.readium.navigator.web.layout.ReadingOrder @@ -22,21 +21,24 @@ import org.readium.navigator.web.preferences.FixedWebSettings import org.readium.navigator.web.preferences.FixedWebSettingsResolver import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.util.WebViewServer +import org.readium.r2.navigator.SimpleOverflow +import org.readium.r2.navigator.preferences.Axis import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.InternalReadiumApi import org.readium.r2.shared.publication.Metadata @ExperimentalReadiumApi @Stable public class FixedWebNavigatorState internal constructor( publicationMetadata: Metadata, - internal val readingOrder: ReadingOrder, + override val readingOrder: ReadingOrder, initialPreferences: FixedWebPreferences, defaults: FixedWebDefaults, initialItem: Int, internal val webViewServer: WebViewServer, internal val preloadedData: PreloadedData -) : NavigatorState, Configurable { +) : Navigator, Configurable, Overflowable { init { require(initialItem < readingOrder.items.size) @@ -47,9 +49,6 @@ public class FixedWebNavigatorState internal constructor( val prepaginatedDoubleContent: String ) - private val coroutineScope: CoroutineScope = - MainScope() - private val settingsResolver = FixedWebSettingsResolver(publicationMetadata, defaults) @@ -80,8 +79,9 @@ public class FixedWebNavigatorState internal constructor( public val currentItem: State = derivedStateOf { layout.value.pageIndexForSpread(pagerState.currentPage) } - public suspend fun goTo(item: Int): Unit = + public override suspend fun goTo(item: Int) { pagerState.scrollToPage(layout.value.spreadIndexForPage(item)) + } public suspend fun animateGoTo( item: Int, @@ -92,9 +92,32 @@ public class FixedWebNavigatorState internal constructor( animationSpec = animationSpec ) - internal fun goToSync(item: Int) { - coroutineScope.launch { - goTo((item)) + @ExperimentalReadiumApi + @OptIn(InternalReadiumApi::class) + override val overflow: State = + derivedStateOf { + SimpleOverflow( + settings.value.readingProgression, + false, + Axis.HORIZONTAL + ) + } + + override val canMoveForward: Boolean + get() = pagerState.currentPage < layout.value.spreads.size - 1 + + override val canMoveBackward: Boolean + get() = pagerState.currentPage > 0 + + override suspend fun moveForward() { + if (canMoveForward) { + pagerState.scrollToPage(pagerState.currentPage + 1) + } + } + + override suspend fun moveBackward() { + if (canMoveBackward) { + pagerState.scrollToPage(pagerState.currentPage - 1) } } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt index 1528884b5a..891e5d21cc 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt @@ -1,19 +1,14 @@ package org.readium.navigator.web.layout -import org.readium.r2.shared.DelicateReadiumApi +import org.readium.navigator.common.ReadingOrder import org.readium.r2.shared.publication.presentation.Presentation import org.readium.r2.shared.util.Url -internal data class ReadingOrder( - val items: List -) { - @OptIn(DelicateReadiumApi::class) - fun indexOfHref(href: Url): Int? = items - .indexOfFirst { it.href == href } - .takeUnless { it == -1 } -} +public data class ReadingOrder( + override val items: List +) : ReadingOrder -internal data class ReadingOrderItem( - val href: Url, +public data class ReadingOrderItem( + override val href: Url, val page: Presentation.Page? -) +) : ReadingOrder.Item diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt index 47bf0f4552..fc919f951b 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt @@ -13,13 +13,14 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import org.readium.navigator.common.LinkContext +import org.readium.navigator.common.TapEvent import org.readium.navigator.web.layout.DoubleViewportSpread import org.readium.navigator.web.util.DisplayArea import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.webapi.FixedDoubleApi import org.readium.navigator.web.webview.LoadingState import org.readium.navigator.web.webview.rememberWebViewStateWithHTMLData -import org.readium.r2.navigator.input.TapEvent import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl @@ -28,7 +29,7 @@ import org.readium.r2.shared.util.Url @Composable internal fun DoubleViewportSpread( onTap: (TapEvent) -> Unit, - onLinkActivated: (Url) -> Unit, + onLinkActivated: (Url, LinkContext?) -> Unit, state: DoubleSpreadState, backgroundColor: Color ) { @@ -71,7 +72,12 @@ internal fun DoubleViewportSpread( state = webViewState, client = state.webViewClient, onTap = onTap, - onLinkActivated = { onLinkActivated(state.publicationBaseUrl.relativize(it)) }, + onLinkActivated = { url, context -> + onLinkActivated( + state.publicationBaseUrl.relativize(url), + context + ) + }, backgroundColor = backgroundColor ) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt index 5681ecb758..89a973ca84 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt @@ -13,13 +13,14 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import org.readium.navigator.common.LinkContext +import org.readium.navigator.common.TapEvent import org.readium.navigator.web.layout.SingleViewportSpread import org.readium.navigator.web.util.DisplayArea import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.webapi.FixedSingleApi import org.readium.navigator.web.webview.LoadingState import org.readium.navigator.web.webview.rememberWebViewStateWithHTMLData -import org.readium.r2.navigator.input.TapEvent import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl @@ -28,7 +29,7 @@ import org.readium.r2.shared.util.Url @Composable internal fun SingleViewportSpread( onTap: (TapEvent) -> Unit, - onLinkActivated: (Url) -> Unit, + onLinkActivated: (Url, LinkContext?) -> Unit, state: SingleSpreadState, backgroundColor: Color ) { @@ -71,7 +72,12 @@ internal fun SingleViewportSpread( state = webViewState, client = state.webViewClient, onTap = onTap, - onLinkActivated = { onLinkActivated(state.publicationBaseUrl.relativize(it)) }, + onLinkActivated = { url, context -> + onLinkActivated( + state.publicationBaseUrl.relativize(url), + context + ) + }, backgroundColor = backgroundColor ) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt index 1755de0f29..cd37dc1313 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt @@ -1,7 +1,6 @@ package org.readium.navigator.web.spread import android.annotation.SuppressLint -import android.graphics.PointF import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -10,41 +9,43 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.input.nestedscroll.nestedScroll -import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.DpOffset +import org.readium.navigator.common.LinkContext +import org.readium.navigator.common.TapEvent import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.webapi.GesturesApi import org.readium.navigator.web.webapi.GesturesListener import org.readium.navigator.web.webview.WebView import org.readium.navigator.web.webview.WebViewScrollable2DState import org.readium.navigator.web.webview.WebViewState -import org.readium.r2.navigator.input.TapEvent +import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.AbsoluteUrl +@OptIn(ExperimentalReadiumApi::class) @SuppressLint("SetJavaScriptEnabled") @Composable internal fun SpreadWebView( state: WebViewState, client: WebViewClient, onTap: (TapEvent) -> Unit, - onLinkActivated: (AbsoluteUrl) -> Unit, + onLinkActivated: (AbsoluteUrl, LinkContext?) -> Unit, backgroundColor: Color ) { val scrollableState = remember { WebViewScrollable2DState() } val spreadNestedScrollConnection = SpreadNestedScrollConnection(scrollableState) - val density = LocalDensity.current val gesturesApi = remember(onTap) { val listener = object : GesturesListener { - override fun onTap(point: PointF) { - onTap(TapEvent(point)) + override fun onTap(offset: DpOffset) { + onTap(TapEvent(offset)) } override fun onLinkActivated(href: AbsoluteUrl) { - onLinkActivated(href) + onLinkActivated(href, null) } } - GesturesApi(density, listener) + GesturesApi(listener) } LaunchedEffect(state.webView) { diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/DisplayArea.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/DisplayArea.kt index f8bc43872b..18443b558e 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/util/DisplayArea.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/util/DisplayArea.kt @@ -1,15 +1,16 @@ package org.readium.navigator.web.util -import androidx.compose.ui.geometry.Size +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.DpSize internal data class DisplayArea( - val viewportSize: Size, + val viewportSize: DpSize, val safeDrawingPadding: AbsolutePaddingValues ) internal data class AbsolutePaddingValues( - val top: Int, - val right: Int, - val bottom: Int, - val left: Int + val top: Dp, + val right: Dp, + val bottom: Dp, + val left: Dp ) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/FixedDoubleApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/FixedDoubleApi.kt index 8bee38bf12..493f74b776 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/FixedDoubleApi.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/FixedDoubleApi.kt @@ -38,11 +38,12 @@ internal class FixedDoubleApi( } fun setDisplayArea(displayArea: DisplayArea) { - val (width, height) = displayArea.viewportSize - val top = displayArea.safeDrawingPadding.top - val right = displayArea.safeDrawingPadding.right - val bottom = displayArea.safeDrawingPadding.bottom - val left = displayArea.safeDrawingPadding.left + val width = displayArea.viewportSize.width.value + val height = displayArea.viewportSize.height.value + val top = displayArea.safeDrawingPadding.top.value + val right = displayArea.safeDrawingPadding.right.value + val bottom = displayArea.safeDrawingPadding.bottom.value + val left = displayArea.safeDrawingPadding.left.value val script = "doubleArea.setViewport($width, $height, $top, $right, $bottom, $left);" webView.evaluateJavascript(script) {} } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/FixedSingleApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/FixedSingleApi.kt index fbfe14281c..0d5dcf0297 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/FixedSingleApi.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/FixedSingleApi.kt @@ -34,11 +34,12 @@ internal class FixedSingleApi( } fun setDisplayArea(displayArea: DisplayArea) { - val (width, height) = displayArea.viewportSize - val top = displayArea.safeDrawingPadding.top - val right = displayArea.safeDrawingPadding.right - val bottom = displayArea.safeDrawingPadding.bottom - val left = displayArea.safeDrawingPadding.left + val width = displayArea.viewportSize.width.value + val height = displayArea.viewportSize.height.value + val top = displayArea.safeDrawingPadding.top.value + val right = displayArea.safeDrawingPadding.right.value + val bottom = displayArea.safeDrawingPadding.bottom.value + val left = displayArea.safeDrawingPadding.left.value val script = "singleArea.setViewport($width, $height, $top, $right, $bottom, $left);" webView.evaluateJavascript(script) {} } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/GesturesApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/GesturesApi.kt index a6766ecd8a..29b8cfec02 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/GesturesApi.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/GesturesApi.kt @@ -1,8 +1,7 @@ package org.readium.navigator.web.webapi -import android.graphics.PointF import android.webkit.WebView -import androidx.compose.ui.unit.Density +import androidx.compose.ui.unit.DpOffset import androidx.compose.ui.unit.dp import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json @@ -12,12 +11,11 @@ import timber.log.Timber internal interface GesturesListener { - fun onTap(point: PointF) + fun onTap(offset: DpOffset) fun onLinkActivated(href: AbsoluteUrl) } internal class GesturesApi( - private val density: Density, private val listener: GesturesListener ) { @@ -35,9 +33,7 @@ internal class GesturesApi( fun onTap(eventJson: String) { Timber.d("onTap start $eventJson") val tapEvent = Json.decodeFromString(eventJson) - val point = with(density) { PointF(tapEvent.x.dp.toPx(), tapEvent.y.dp.toPx()) } - Timber.d("onTap ${point.x} ${point.y}") - listener.onTap(point) + listener.onTap(DpOffset(tapEvent.x.dp, tapEvent.y.dp)) } @android.webkit.JavascriptInterface From e78d298a4d325c88cb9658749220d9c0fcb217de Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 23 Oct 2024 02:36:49 +0200 Subject: [PATCH 47/61] Fix navigation history and clean up --- .../navigator/common/HyperlinkListener.kt | 19 ++++---- .../readium/navigator/common/InputListener.kt | 4 +- .../org/readium/navigator/common/Navigator.kt | 48 ++++++++++++++++++- .../readium/navigator/common/ReadingOrder.kt | 28 ----------- .../readium/navigator/demo/reader/Reader.kt | 2 +- .../org/readium/navigator/pdf/PdfNavigator.kt | 14 +++++- .../navigator/pdf/PdfNavigatorFactory.kt | 9 +--- .../navigator/pdf/PdfNavigatorLocation.kt | 11 +++++ .../navigator/pdf/PdfNavigatorState.kt | 30 ++++++------ .../{ReadingOrder.kt => PdfReadingOrder.kt} | 6 +-- .../scripts/dist/fixed-injectable-script.js | 2 +- .../dist/fixed-injectable-script.js.map | 2 +- .../web/scripts/src/index-fixed-injectable.ts | 2 - .../navigators/web/fixed-injectable-script.js | 2 +- .../web/fixed-injectable-script.js.map | 2 +- .../navigator/web/FixedWebNavigator.kt | 6 +-- .../navigator/web/FixedWebNavigatorFactory.kt | 8 ++-- .../web/FixedWebNavigatorLocation.kt | 8 ++++ .../navigator/web/FixedWebNavigatorState.kt | 18 +++++-- ...eadingOrder.kt => FixedWebReadingOrder.kt} | 6 +-- .../navigator/web/layout/LayoutResolver.kt | 2 +- 21 files changed, 136 insertions(+), 93 deletions(-) delete mode 100644 readium/navigators/common/src/main/java/org/readium/navigator/common/ReadingOrder.kt create mode 100644 readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorLocation.kt rename readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/{ReadingOrder.kt => PdfReadingOrder.kt} (60%) create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorLocation.kt rename readium/navigators/web/src/main/java/org/readium/navigator/web/layout/{ReadingOrder.kt => FixedWebReadingOrder.kt} (68%) diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt index ac2b3406f9..153b660173 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt @@ -35,14 +35,14 @@ public data class FootnoteContext( @ExperimentalReadiumApi @Composable -public fun defaultHyperlinkListener( - navigatorState: Navigator, +public fun defaultHyperlinkListener( + navigatorState: Navigator, shouldFollowReadingOrderLink: (Url, LinkContext?) -> Boolean = { _, _ -> true }, - // shouldFollowResourceLink: (Url, LinkContext?) -> Boolean = { _, _ -> true }, + // TODO: shouldFollowResourceLink: (Url, LinkContext?) -> Boolean = { _, _ -> true }, onExternalLinkActivated: (AbsoluteUrl, LinkContext?) -> Unit = { _, _ -> } ): HyperlinkListener { val coroutineScope = rememberCoroutineScope() - val navigationHistory: MutableList = remember { mutableListOf() } + val navigationHistory: MutableList = remember { mutableListOf() } BackHandler(enabled = navigationHistory.isNotEmpty()) { val previousItem = navigationHistory.removeLast() @@ -59,19 +59,18 @@ public fun defaultHyperlinkListener( } @ExperimentalReadiumApi -private class DefaultHyperlinkListener( +private class DefaultHyperlinkListener( private val coroutineScope: CoroutineScope, - private val navigatorState: Navigator, - private val navigationHistory: MutableList, + private val navigatorState: Navigator, + private val navigationHistory: MutableList, private val shouldFollowReadingOrderLink: (Url, LinkContext?) -> Boolean, private val onExternalLinkActivatedDelegate: (AbsoluteUrl, LinkContext?) -> Unit ) : HyperlinkListener { override fun onReadingOrderLinkActivated(url: Url, context: LinkContext?) { if (shouldFollowReadingOrderLink(url, context)) { - val item = checkNotNull(navigatorState.readingOrder.indexOfHref(url)) - navigationHistory.add(item) - coroutineScope.launch { navigatorState.goTo(item) } + navigationHistory.add(navigatorState.location.value) + coroutineScope.launch { navigatorState.goTo(url) } } } diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt index ecaf0db01a..af70543ad6 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt @@ -51,7 +51,7 @@ public fun defaultInputListener( horizontalEdgeThresholdPercent: Double? = 0.3, minimumVerticalEdgeSize: Dp = 80.0.dp, verticalEdgeThresholdPercent: Double? = 0.3 -): InputListener where T : Navigator, T : Overflowable { +): InputListener where T : Navigator, T : Overflowable { val coroutineScope = rememberCoroutineScope() return DefaultInputListener( @@ -78,7 +78,7 @@ private class DefaultInputListener( private val horizontalEdgeThresholdPercent: Double?, private val minimumVerticalEdgeSize: Dp, private val verticalEdgeThresholdPercent: Double? -) : InputListener where T : Navigator, T : Overflowable { +) : InputListener where T : Navigator, T : Overflowable { override fun onTap(event: TapEvent, context: TapContext) { if (!handleTap(event, context)) { diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt index 6ccc1c63c1..0989c1ccc8 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt @@ -1,11 +1,55 @@ package org.readium.navigator.common +import androidx.compose.runtime.State +import org.readium.r2.shared.DelicateReadiumApi import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.util.Url @ExperimentalReadiumApi -public interface Navigator { +public interface Navigator { public val readingOrder: R - public suspend fun goTo(item: Int) + public val location: State + + public suspend fun goTo(location: L) + + public suspend fun goTo(readingOrderItem: Int) + + public suspend fun goTo(url: Url) { + val itemIndex = readingOrder.indexOfHref(url) ?: return + goTo(itemIndex) + } +} + +/** + * Data about the content to play. + */ +public interface ReadingOrder { + + /** + * List of items to play. + */ + public val items: List + + /** + * A piece of the content to play. + */ + public interface Item { + + public val href: Url + } + + @OptIn(DelicateReadiumApi::class) + public fun indexOfHref(href: Url): Int? = items + .indexOfFirst { it.href == href } + .takeUnless { it == -1 } +} + +/** + * Location of the navigator. + */ +public interface Location { + + public val href: Url } diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/ReadingOrder.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/ReadingOrder.kt deleted file mode 100644 index a203fad909..0000000000 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/ReadingOrder.kt +++ /dev/null @@ -1,28 +0,0 @@ -package org.readium.navigator.common - -import org.readium.r2.shared.DelicateReadiumApi -import org.readium.r2.shared.util.Url - -/** - * Data about the content to play. - */ -public interface ReadingOrder { - - /** - * List of items to play. - */ - public val items: List - - /** - * A piece of the content to play. - */ - public interface Item { - - public val href: Url - } - - @OptIn(DelicateReadiumApi::class) - public fun indexOfHref(href: Url): Int? = items - .indexOfFirst { it.href == href } - .takeUnless { it == -1 } -} diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt index 52ff7a98a6..37893e03ec 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt @@ -52,7 +52,7 @@ import org.readium.r2.shared.util.toUri data class ReaderState( val coroutineScope: CoroutineScope, val publication: Publication, - val navigatorState: Navigator, + val navigatorState: Navigator, val preferencesViewModel: UserPreferencesViewModel<*, *> ) { diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigator.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigator.kt index 207c3c5b04..022689297d 100644 --- a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigator.kt +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigator.kt @@ -39,6 +39,8 @@ public fun > PdfNavigator( ) { val preferencesFlow = snapshotFlow { state.preferences.value } + val pendingPositionFlow = snapshotFlow { state.pendingLocator.value } + AndroidFragment>( modifier = modifier, onUpdate = { @@ -62,12 +64,20 @@ public fun > PdfNavigator( fragment.currentLocator .onEach { locator -> state.locator.value = locator - } - .launchIn(fragment.lifecycleScope) + }.launchIn(fragment.lifecycleScope) preferencesFlow .onEach { preferences -> fragment.submitPreferences(preferences) } .launchIn(fragment.lifecycleScope) + + pendingPositionFlow + .onEach { locator -> + if (locator != null) { + fragment.go(locator) + state.pendingLocator.value = null + } + } + .launchIn(fragment.lifecycleScope) } it.setNavigatorFactory( diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt index 5d9888661d..d4e4234cc0 100644 --- a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt @@ -27,8 +27,8 @@ public class PdfNavigatorFactory, E : Preferenc initialPreferences: P? = null ): Try, Nothing> { val readingOrder = - ReadingOrder( - publication.readingOrder.map { ReadingOrderItem(it.url()) } + PdfReadingOrder( + publication.readingOrder.map { PdfReadingOrderItem(it.url()) } ) val actualInitialLocator = initialLocator @@ -44,16 +44,11 @@ public class PdfNavigatorFactory, E : Preferenc pdfEngineProvider.computeSettings(publication.metadata, preferences) } - val overflowResolver = { settings: S -> - pdfEngineProvider.computeOverflow(settings) - } - val navigatorState = PdfNavigatorState( readingOrder, legacyNavigatorFactory, settingsResolver, - overflowResolver, actualInitialLocator, actualInitialPreferences ) diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorLocation.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorLocation.kt new file mode 100644 index 0000000000..dbe39684f0 --- /dev/null +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorLocation.kt @@ -0,0 +1,11 @@ +package org.readium.navigator.pdf + +import org.readium.navigator.common.Location +import org.readium.r2.shared.publication.Locator +import org.readium.r2.shared.util.Url + +public data class PdfNavigatorLocation( + val locator: Locator +) : Location { + override val href: Url = locator.href +} diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt index be3f78dcb5..bcb17719f1 100644 --- a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt @@ -7,7 +7,6 @@ import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.mutableStateOf import org.readium.navigator.common.Configurable import org.readium.navigator.common.Navigator -import org.readium.navigator.common.Overflow import org.readium.navigator.common.Preferences import org.readium.navigator.common.Settings import org.readium.r2.navigator.pdf.PdfNavigatorFactory @@ -17,13 +16,12 @@ import org.readium.r2.shared.publication.Locator @ExperimentalReadiumApi @Stable public class PdfNavigatorState> internal constructor( - override val readingOrder: ReadingOrder, + override val readingOrder: PdfReadingOrder, internal val pdfNavigatorFactory: PdfNavigatorFactory, private val settingsResolver: (P) -> S, - private val overflowResolver: (S) -> Overflow, - private val initialLocator: Locator, + initialLocator: Locator, initialPreferences: P -) : Navigator, Configurable { // , Overflowable { +) : Navigator, Configurable { override val preferences: MutableState

      = mutableStateOf(initialPreferences) @@ -34,17 +32,17 @@ public class PdfNavigatorState> internal constr internal val locator: MutableState = mutableStateOf(initialLocator) - private val currentPage: Int get() = - locator.value.locations.position ?: initialLocator.locations.position ?: 0 - override suspend fun goTo(item: Int) { - throw NotImplementedError() + internal val pendingLocator: MutableState = + mutableStateOf(null) + + override val location: State = + derivedStateOf { PdfNavigatorLocation(locator.value) } + + override suspend fun goTo(location: PdfNavigatorLocation) { + pendingLocator.value = locator.value } - /*@ExperimentalReadiumApi - public val overflow: State = - derivedStateOf { overflowResolver.invoke(settings.value) } - public val canMoveForward: Boolean - get() = currentPage < readingOrder.items[0].pageCount - 1 - public val canMoveBackward: Boolean - get() = currentPage > 0*/ + override suspend fun goTo(readingOrderItem: Int) { + pendingLocator.value = locator.value.copy(locations = Locator.Locations(position = 0)) + } } diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/ReadingOrder.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfReadingOrder.kt similarity index 60% rename from readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/ReadingOrder.kt rename to readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfReadingOrder.kt index 18cb293bd5..4049227cdb 100644 --- a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/ReadingOrder.kt +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfReadingOrder.kt @@ -3,10 +3,10 @@ package org.readium.navigator.pdf import org.readium.navigator.common.ReadingOrder import org.readium.r2.shared.util.Url -public data class ReadingOrder( - override val items: List +public data class PdfReadingOrder( + override val items: List ) : ReadingOrder -public data class ReadingOrderItem( +public data class PdfReadingOrderItem( override val href: Url ) : ReadingOrder.Item diff --git a/readium/navigators/web/scripts/dist/fixed-injectable-script.js b/readium/navigators/web/scripts/dist/fixed-injectable-script.js index 5b4c9df605..85480a39eb 100644 --- a/readium/navigators/web/scripts/dist/fixed-injectable-script.js +++ b/readium/navigators/web/scripts/dist/fixed-injectable-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class e{constructor(e,t){this.window=e,this.listener=t,document.addEventListener("click",(e=>{this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();if(t&&"Range"==t.type)return;let n;n=e.target instanceof HTMLElement?this.nearestInteractiveElement(e.target):null,n?n instanceof HTMLAnchorElement&&this.listener.onLinkActivated(n.href):this.listener.onTap(e),e.stopPropagation(),e.preventDefault()}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}window.addEventListener("message",(n=>{if(n.ports[0]){console.log("receiving port");const s=n.ports[0],i=new t(s);new e(window,i)}}));class t{constructor(e){this.messagePort=e}onTap(e){console.log("posting event");const t={x:e.clientX,y:e.clientY};this.messagePort.postMessage(t)}onLinkActivated(e){this.messagePort.postMessage({href:e})}}}(); +!function(){"use strict";class e{constructor(e,t){this.window=e,this.listener=t,document.addEventListener("click",(e=>{this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();if(t&&"Range"==t.type)return;let n;n=e.target instanceof HTMLElement?this.nearestInteractiveElement(e.target):null,n?n instanceof HTMLAnchorElement&&this.listener.onLinkActivated(n.href):this.listener.onTap(e),e.stopPropagation(),e.preventDefault()}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}window.addEventListener("message",(n=>{if(n.ports[0]){const s=n.ports[0],i=new t(s);new e(window,i)}}));class t{constructor(e){this.messagePort=e}onTap(e){const t={x:e.clientX,y:e.clientY};this.messagePort.postMessage(t)}onLinkActivated(e){this.messagePort.postMessage({href:e})}}}(); //# sourceMappingURL=fixed-injectable-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map b/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map index ca0b2fafde..d62e03519e 100644 --- a/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map +++ b/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAAO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBE,SAASC,iBAAiB,SAAUC,IAChCH,KAAKI,QAAQD,EAAM,IACpB,EACP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAN,EAAMO,kBAAkBC,YACPX,KAAKY,0BAA0BT,EAAMO,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1Bb,KAAKD,SAASe,gBAAgBL,EAAeM,MAIjDf,KAAKD,SAASiB,MAAMb,GAExBA,EAAMc,kBACNd,EAAMe,gBACV,CAEA,yBAAAN,CAA0BO,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACDzB,KAAKY,0BAA0BO,EAAQM,eAE3C,IACX,EC5DJ3B,OAAOI,iBAAiB,WAAYC,IAChC,GAAIA,EAAMuB,MAAM,GAAI,CAChBC,QAAQC,IAAI,kBACZ,MAAMC,EAAc1B,EAAMuB,MAAM,GAC1BI,EAAoB,IAAIC,EAA0BF,GACxD,IAAIjC,EAAiBE,OAAQgC,EACjC,KAEJ,MAAMC,EACF,WAAAlC,CAAYgC,GACR7B,KAAK6B,YAAcA,CACvB,CACA,KAAAb,CAAMb,GACFwB,QAAQC,IAAI,iBACZ,MAAMI,EAAW,CAAEC,EAAG9B,EAAM+B,QAASC,EAAGhC,EAAMiC,SAC9CpC,KAAK6B,YAAYQ,YAAYL,EACjC,CACA,eAAAlB,CAAgBC,GACZf,KAAK6B,YAAYQ,YAAY,CAAEtB,KAAMA,GACzC,E","sources":["webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/index-fixed-injectable.ts"],"sourcesContent":["export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nwindow.addEventListener(\"message\", (event) => {\n if (event.ports[0]) {\n console.log(\"receiving port\");\n const messagePort = event.ports[0];\n const messagingListener = new MessagingGesturesListener(messagePort);\n new GesturesDetector(window, messagingListener);\n }\n});\nclass MessagingGesturesListener {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n onTap(event) {\n console.log(\"posting event\");\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.messagePort.postMessage(tapEvent);\n }\n onLinkActivated(href) {\n this.messagePort.postMessage({ href: href });\n }\n}\n"],"names":["GesturesDetector","constructor","window","listener","this","document","addEventListener","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","onLinkActivated","href","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","ports","console","log","messagePort","messagingListener","MessagingGesturesListener","tapEvent","x","clientX","y","clientY","postMessage"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAAO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBE,SAASC,iBAAiB,SAAUC,IAChCH,KAAKI,QAAQD,EAAM,IACpB,EACP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAN,EAAMO,kBAAkBC,YACPX,KAAKY,0BAA0BT,EAAMO,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1Bb,KAAKD,SAASe,gBAAgBL,EAAeM,MAIjDf,KAAKD,SAASiB,MAAMb,GAExBA,EAAMc,kBACNd,EAAMe,gBACV,CAEA,yBAAAN,CAA0BO,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACDzB,KAAKY,0BAA0BO,EAAQM,eAE3C,IACX,EC5DJ3B,OAAOI,iBAAiB,WAAYC,IAChC,GAAIA,EAAMuB,MAAM,GAAI,CAChB,MAAMC,EAAcxB,EAAMuB,MAAM,GAC1BE,EAAoB,IAAIC,EAA0BF,GACxD,IAAI/B,EAAiBE,OAAQ8B,EACjC,KAEJ,MAAMC,EACF,WAAAhC,CAAY8B,GACR3B,KAAK2B,YAAcA,CACvB,CACA,KAAAX,CAAMb,GACF,MAAM2B,EAAW,CAAEC,EAAG5B,EAAM6B,QAASC,EAAG9B,EAAM+B,SAC9ClC,KAAK2B,YAAYQ,YAAYL,EACjC,CACA,eAAAhB,CAAgBC,GACZf,KAAK2B,YAAYQ,YAAY,CAAEpB,KAAMA,GACzC,E","sources":["webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/index-fixed-injectable.ts"],"sourcesContent":["export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nwindow.addEventListener(\"message\", (event) => {\n if (event.ports[0]) {\n const messagePort = event.ports[0];\n const messagingListener = new MessagingGesturesListener(messagePort);\n new GesturesDetector(window, messagingListener);\n }\n});\nclass MessagingGesturesListener {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n onTap(event) {\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.messagePort.postMessage(tapEvent);\n }\n onLinkActivated(href) {\n this.messagePort.postMessage({ href: href });\n }\n}\n"],"names":["GesturesDetector","constructor","window","listener","this","document","addEventListener","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","onLinkActivated","href","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","ports","messagePort","messagingListener","MessagingGesturesListener","tapEvent","x","clientX","y","clientY","postMessage"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/src/index-fixed-injectable.ts b/readium/navigators/web/scripts/src/index-fixed-injectable.ts index 9a643ce659..0e0e4c3a75 100644 --- a/readium/navigators/web/scripts/src/index-fixed-injectable.ts +++ b/readium/navigators/web/scripts/src/index-fixed-injectable.ts @@ -12,7 +12,6 @@ import { GesturesDetector, GesturesListener } from "./common/gestures" window.addEventListener("message", (event) => { if (event.ports[0]) { - console.log("receiving port") const messagePort = event.ports[0] const messagingListener = new MessagingGesturesListener(messagePort) new GesturesDetector(window, messagingListener) @@ -27,7 +26,6 @@ class MessagingGesturesListener implements GesturesListener { } onTap(event: MouseEvent): void { - console.log("posting event") const tapEvent = { x: event.clientX, y: event.clientY } this.messagePort.postMessage(tapEvent) } diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js index 5b4c9df605..85480a39eb 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class e{constructor(e,t){this.window=e,this.listener=t,document.addEventListener("click",(e=>{this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();if(t&&"Range"==t.type)return;let n;n=e.target instanceof HTMLElement?this.nearestInteractiveElement(e.target):null,n?n instanceof HTMLAnchorElement&&this.listener.onLinkActivated(n.href):this.listener.onTap(e),e.stopPropagation(),e.preventDefault()}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}window.addEventListener("message",(n=>{if(n.ports[0]){console.log("receiving port");const s=n.ports[0],i=new t(s);new e(window,i)}}));class t{constructor(e){this.messagePort=e}onTap(e){console.log("posting event");const t={x:e.clientX,y:e.clientY};this.messagePort.postMessage(t)}onLinkActivated(e){this.messagePort.postMessage({href:e})}}}(); +!function(){"use strict";class e{constructor(e,t){this.window=e,this.listener=t,document.addEventListener("click",(e=>{this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();if(t&&"Range"==t.type)return;let n;n=e.target instanceof HTMLElement?this.nearestInteractiveElement(e.target):null,n?n instanceof HTMLAnchorElement&&this.listener.onLinkActivated(n.href):this.listener.onTap(e),e.stopPropagation(),e.preventDefault()}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}window.addEventListener("message",(n=>{if(n.ports[0]){const s=n.ports[0],i=new t(s);new e(window,i)}}));class t{constructor(e){this.messagePort=e}onTap(e){const t={x:e.clientX,y:e.clientY};this.messagePort.postMessage(t)}onLinkActivated(e){this.messagePort.postMessage({href:e})}}}(); //# sourceMappingURL=fixed-injectable-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map index ca0b2fafde..d62e03519e 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAAO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBE,SAASC,iBAAiB,SAAUC,IAChCH,KAAKI,QAAQD,EAAM,IACpB,EACP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAN,EAAMO,kBAAkBC,YACPX,KAAKY,0BAA0BT,EAAMO,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1Bb,KAAKD,SAASe,gBAAgBL,EAAeM,MAIjDf,KAAKD,SAASiB,MAAMb,GAExBA,EAAMc,kBACNd,EAAMe,gBACV,CAEA,yBAAAN,CAA0BO,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACDzB,KAAKY,0BAA0BO,EAAQM,eAE3C,IACX,EC5DJ3B,OAAOI,iBAAiB,WAAYC,IAChC,GAAIA,EAAMuB,MAAM,GAAI,CAChBC,QAAQC,IAAI,kBACZ,MAAMC,EAAc1B,EAAMuB,MAAM,GAC1BI,EAAoB,IAAIC,EAA0BF,GACxD,IAAIjC,EAAiBE,OAAQgC,EACjC,KAEJ,MAAMC,EACF,WAAAlC,CAAYgC,GACR7B,KAAK6B,YAAcA,CACvB,CACA,KAAAb,CAAMb,GACFwB,QAAQC,IAAI,iBACZ,MAAMI,EAAW,CAAEC,EAAG9B,EAAM+B,QAASC,EAAGhC,EAAMiC,SAC9CpC,KAAK6B,YAAYQ,YAAYL,EACjC,CACA,eAAAlB,CAAgBC,GACZf,KAAK6B,YAAYQ,YAAY,CAAEtB,KAAMA,GACzC,E","sources":["webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/index-fixed-injectable.ts"],"sourcesContent":["export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nwindow.addEventListener(\"message\", (event) => {\n if (event.ports[0]) {\n console.log(\"receiving port\");\n const messagePort = event.ports[0];\n const messagingListener = new MessagingGesturesListener(messagePort);\n new GesturesDetector(window, messagingListener);\n }\n});\nclass MessagingGesturesListener {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n onTap(event) {\n console.log(\"posting event\");\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.messagePort.postMessage(tapEvent);\n }\n onLinkActivated(href) {\n this.messagePort.postMessage({ href: href });\n }\n}\n"],"names":["GesturesDetector","constructor","window","listener","this","document","addEventListener","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","onLinkActivated","href","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","ports","console","log","messagePort","messagingListener","MessagingGesturesListener","tapEvent","x","clientX","y","clientY","postMessage"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAAO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBE,SAASC,iBAAiB,SAAUC,IAChCH,KAAKI,QAAQD,EAAM,IACpB,EACP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAN,EAAMO,kBAAkBC,YACPX,KAAKY,0BAA0BT,EAAMO,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1Bb,KAAKD,SAASe,gBAAgBL,EAAeM,MAIjDf,KAAKD,SAASiB,MAAMb,GAExBA,EAAMc,kBACNd,EAAMe,gBACV,CAEA,yBAAAN,CAA0BO,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACDzB,KAAKY,0BAA0BO,EAAQM,eAE3C,IACX,EC5DJ3B,OAAOI,iBAAiB,WAAYC,IAChC,GAAIA,EAAMuB,MAAM,GAAI,CAChB,MAAMC,EAAcxB,EAAMuB,MAAM,GAC1BE,EAAoB,IAAIC,EAA0BF,GACxD,IAAI/B,EAAiBE,OAAQ8B,EACjC,KAEJ,MAAMC,EACF,WAAAhC,CAAY8B,GACR3B,KAAK2B,YAAcA,CACvB,CACA,KAAAX,CAAMb,GACF,MAAM2B,EAAW,CAAEC,EAAG5B,EAAM6B,QAASC,EAAG9B,EAAM+B,SAC9ClC,KAAK2B,YAAYQ,YAAYL,EACjC,CACA,eAAAhB,CAAgBC,GACZf,KAAK2B,YAAYQ,YAAY,CAAEpB,KAAMA,GACzC,E","sources":["webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/index-fixed-injectable.ts"],"sourcesContent":["export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nwindow.addEventListener(\"message\", (event) => {\n if (event.ports[0]) {\n const messagePort = event.ports[0];\n const messagingListener = new MessagingGesturesListener(messagePort);\n new GesturesDetector(window, messagingListener);\n }\n});\nclass MessagingGesturesListener {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n onTap(event) {\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.messagePort.postMessage(tapEvent);\n }\n onLinkActivated(href) {\n this.messagePort.postMessage({ href: href });\n }\n}\n"],"names":["GesturesDetector","constructor","window","listener","this","document","addEventListener","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","onLinkActivated","href","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","ports","messagePort","messagingListener","MessagingGesturesListener","tapEvent","x","clientX","y","clientY","postMessage"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt index 7a96c3ff61..8e98953aed 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt @@ -21,7 +21,7 @@ import org.readium.navigator.common.TapContext import org.readium.navigator.common.defaultHyperlinkListener import org.readium.navigator.common.defaultInputListener import org.readium.navigator.web.layout.DoubleViewportSpread -import org.readium.navigator.web.layout.ReadingOrder +import org.readium.navigator.web.layout.FixedWebReadingOrder import org.readium.navigator.web.layout.SingleViewportSpread import org.readium.navigator.web.pager.NavigatorPager import org.readium.navigator.web.spread.DoubleSpreadState @@ -136,10 +136,10 @@ private fun LayoutDirection.toReadingProgression(): ReadingProgression = private fun onLinkActivated( url: Url, context: LinkContext?, - readingOrder: ReadingOrder, + readingOrder: FixedWebReadingOrder, listener: HyperlinkListener ) { - readingOrder.indexOfHref(url) + readingOrder.indexOfHref(url.removeFragment()) ?.let { listener.onReadingOrderLinkActivated(url, context) } ?: run { when (url) { diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt index 0b61040a63..775aed1b00 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt @@ -8,8 +8,8 @@ package org.readium.navigator.web import android.app.Application import java.io.IOException -import org.readium.navigator.web.layout.ReadingOrder -import org.readium.navigator.web.layout.ReadingOrderItem +import org.readium.navigator.web.layout.FixedWebReadingOrder +import org.readium.navigator.web.layout.FixedWebReadingOrderItem import org.readium.navigator.web.preferences.FixedWebDefaults import org.readium.navigator.web.preferences.FixedWebPreferences import org.readium.navigator.web.preferences.FixedWebPreferencesEditor @@ -78,7 +78,7 @@ public class FixedWebNavigatorFactory private constructor( readingOrder: List = publication.readingOrder ): Try { val items = readingOrder.map { - ReadingOrderItem( + FixedWebReadingOrderItem( href = it.url(), page = it.properties.page ) @@ -104,7 +104,7 @@ public class FixedWebNavigatorFactory private constructor( val navigatorState = FixedWebNavigatorState( publicationMetadata = publication.metadata, - readingOrder = ReadingOrder(items), + readingOrder = FixedWebReadingOrder(items), initialPreferences = initialPreferences ?: FixedWebPreferences(), defaults = defaults, initialItem = initialIndex, diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorLocation.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorLocation.kt new file mode 100644 index 0000000000..7db235ba05 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorLocation.kt @@ -0,0 +1,8 @@ +package org.readium.navigator.web + +import org.readium.navigator.common.Location +import org.readium.r2.shared.util.Url + +public data class FixedWebNavigatorLocation( + override val href: Url +) : Location diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt index 302ac4631e..d3d8d4ee96 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt @@ -12,9 +12,9 @@ import org.readium.navigator.common.Configurable import org.readium.navigator.common.Navigator import org.readium.navigator.common.Overflow import org.readium.navigator.common.Overflowable +import org.readium.navigator.web.layout.FixedWebReadingOrder import org.readium.navigator.web.layout.Layout import org.readium.navigator.web.layout.LayoutResolver -import org.readium.navigator.web.layout.ReadingOrder import org.readium.navigator.web.preferences.FixedWebDefaults import org.readium.navigator.web.preferences.FixedWebPreferences import org.readium.navigator.web.preferences.FixedWebSettings @@ -32,13 +32,13 @@ import org.readium.r2.shared.publication.Metadata @Stable public class FixedWebNavigatorState internal constructor( publicationMetadata: Metadata, - override val readingOrder: ReadingOrder, + override val readingOrder: FixedWebReadingOrder, initialPreferences: FixedWebPreferences, defaults: FixedWebDefaults, initialItem: Int, internal val webViewServer: WebViewServer, internal val preloadedData: PreloadedData -) : Navigator, Configurable, Overflowable { +) : Navigator, Configurable, Overflowable { init { require(initialItem < readingOrder.items.size) @@ -79,8 +79,16 @@ public class FixedWebNavigatorState internal constructor( public val currentItem: State = derivedStateOf { layout.value.pageIndexForSpread(pagerState.currentPage) } - public override suspend fun goTo(item: Int) { - pagerState.scrollToPage(layout.value.spreadIndexForPage(item)) + override val location: State = + derivedStateOf { FixedWebNavigatorLocation(readingOrder.items[currentItem.value].href) } + + override suspend fun goTo(location: FixedWebNavigatorLocation) { + val pageIndex = checkNotNull(readingOrder.indexOfHref(location.href)) + pagerState.scrollToPage(layout.value.spreadIndexForPage(pageIndex)) + } + + public override suspend fun goTo(readingOrderItem: Int) { + pagerState.scrollToPage(layout.value.spreadIndexForPage(readingOrderItem)) } public suspend fun animateGoTo( diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/FixedWebReadingOrder.kt similarity index 68% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/layout/FixedWebReadingOrder.kt index 891e5d21cc..641d3e3f4d 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/FixedWebReadingOrder.kt @@ -4,11 +4,11 @@ import org.readium.navigator.common.ReadingOrder import org.readium.r2.shared.publication.presentation.Presentation import org.readium.r2.shared.util.Url -public data class ReadingOrder( - override val items: List +public data class FixedWebReadingOrder( + override val items: List ) : ReadingOrder -public data class ReadingOrderItem( +public data class FixedWebReadingOrderItem( override val href: Url, val page: Presentation.Page? ) : ReadingOrder.Item diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt index 3e10e37f9a..119d3a18aa 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt @@ -7,7 +7,7 @@ import org.readium.r2.shared.publication.presentation.Presentation @OptIn(ExperimentalReadiumApi::class) internal class LayoutResolver( - private val readingOrder: ReadingOrder + private val readingOrder: FixedWebReadingOrder ) { fun layout(settings: FixedWebSettings): List = From 9d78b0319da3437e80d13d57d1cd60fcfe53b967 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 23 Oct 2024 05:21:35 +0200 Subject: [PATCH 48/61] Show page as soon as we have viewport size --- .../web/scripts/dist/fixed-double-script.js | 2 +- .../scripts/dist/fixed-double-script.js.map | 2 +- .../scripts/dist/fixed-injectable-script.js | 2 +- .../dist/fixed-injectable-script.js.map | 2 +- .../web/scripts/dist/fixed-single-script.js | 2 +- .../scripts/dist/fixed-single-script.js.map | 2 +- .../scripts/src/fixed/double-area-manager.ts | 12 +++ .../web/scripts/src/fixed/iframe-message.ts | 34 +++++++++ .../web/scripts/src/fixed/page-manager.ts | 76 ++++++------------- .../scripts/src/fixed/single-area-manager.ts | 6 ++ .../web/scripts/src/index-fixed-injectable.ts | 40 ++++++---- .../web/scripts/src/util/viewport.ts | 20 +++++ .../navigators/web/fixed-double-script.js | 2 +- .../navigators/web/fixed-double-script.js.map | 2 +- .../navigators/web/fixed-injectable-script.js | 2 +- .../web/fixed-injectable-script.js.map | 2 +- .../navigators/web/fixed-single-script.js | 2 +- .../navigators/web/fixed-single-script.js.map | 2 +- 18 files changed, 134 insertions(+), 78 deletions(-) create mode 100644 readium/navigators/web/scripts/src/fixed/iframe-message.ts diff --git a/readium/navigators/web/scripts/dist/fixed-double-script.js b/readium/navigators/web/scripts/dist/fixed-double-script.js index 7a962b418e..9bd7f2adc7 100644 --- a/readium/navigators/web/scripts/dist/fixed-double-script.js +++ b/readium/navigators/web/scripts/dist/fixed-double-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}),{once:!0})}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y?this.listener.onTap({x:t.data.x,y:t.data.y}):t.data.href&&this.listener.onLinkActivated(t.data.href)}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),a=parseFloat(i.get("height"));return n&&a?{width:n,height:a}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a,h){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};h.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}},r={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=n.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,n,r),this.metaViewport=a}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,n=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:n},h={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,a,h);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(n).build(),this.leftPage.show(),this.rightPage.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page-left"),h=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,a,h){const o=new n(h);this.manager=new s(t,e,i,a,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,o,window.gestures)}(); +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e}setMessagePort(t){t.onmessage=t=>{this.onMessageFromIframe(t)}}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onMessageFromIframe(t){const e=t.data;switch(e.kind){case"contentSize":return this.onContentSizeAvailable(e.size);case"tap":return this.listener.onTap({x:e.x,y:e.y});case"linkActivated":return this.listener.onLinkActivated(e.href)}}onContentSizeAvailable(t){t&&(this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t,this.listener.onIframeLoaded())}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a,h){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},e.addEventListener("message",(t=>{t.ports[0]&&(t.source===s.contentWindow?this.leftPage.setMessagePort(t.ports[0]):t.source==n.contentWindow&&this.rightPage.setMessagePort(t.ports[0]))})),new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};h.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}},r={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=n.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,n,r),this.metaViewport=a}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,n=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:n},h={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,a,h);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(n).build(),this.leftPage.show(),this.rightPage.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page-left"),h=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,a,h){const o=new n(h);this.manager=new s(t,e,i,a,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,o,window.gestures)}(); //# sourceMappingURL=fixed-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-double-script.js.map b/readium/navigators/web/scripts/dist/fixed-double-script.js.map index 4c767d157c..a79f0cc918 100644 --- a/readium/navigators/web/scripts/dist/fixed-double-script.js.map +++ b/readium/navigators/web/scripts/dist/fixed-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n }, { once: true });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n else if (message.data.href) {\n this.listener.onLinkActivated(message.data.href);\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const leftPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = leftIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n const rightPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = rightIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, leftPageListener);\n this.rightPage = new PageManager(window, rightIframe, rightPageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","once","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","onMessageFromIframe","postMessage","port2","data","x","y","onTap","href","onLinkActivated","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","leftPageListener","layout","boundingRect","getBoundingClientRect","rightPageListener","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n }\n setMessagePort(messagePort) {\n messagePort.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onMessageFromIframe(event) {\n const message = event.data;\n switch (message.kind) {\n case \"contentSize\":\n return this.onContentSizeAvailable(message.size);\n case \"tap\":\n return this.listener.onTap({ x: message.x, y: message.y });\n case \"linkActivated\":\n return this.listener.onLinkActivated(message.href);\n }\n }\n onContentSizeAvailable(size) {\n if (!size) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n this.listener.onIframeLoaded();\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\nexport function parseViewportString(viewportString) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportString))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n window.addEventListener(\"message\", (event) => {\n if (!event.ports[0]) {\n return;\n }\n if (event.source === leftIframe.contentWindow) {\n this.leftPage.setMessagePort(event.ports[0]);\n }\n else if (event.source == rightIframe.contentWindow) {\n this.rightPage.setMessagePort(event.ports[0]);\n }\n });\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const leftPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = leftIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n const rightPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = rightIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, leftPageListener);\n this.rightPage = new PageManager(window, rightIframe, rightPageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","setMessagePort","messagePort","onmessage","message","onMessageFromIframe","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","event","data","kind","onContentSizeAvailable","onTap","x","y","onLinkActivated","href","onIframeLoaded","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","document","addEventListener","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","ports","source","leftPage","rightPage","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","leftPageListener","layout","boundingRect","getBoundingClientRect","rightPageListener","loadSpread","spread","setViewport","viewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","content","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","querySelector","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-injectable-script.js b/readium/navigators/web/scripts/dist/fixed-injectable-script.js index 85480a39eb..61b11ef4c1 100644 --- a/readium/navigators/web/scripts/dist/fixed-injectable-script.js +++ b/readium/navigators/web/scripts/dist/fixed-injectable-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class e{constructor(e,t){this.window=e,this.listener=t,document.addEventListener("click",(e=>{this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();if(t&&"Range"==t.type)return;let n;n=e.target instanceof HTMLElement?this.nearestInteractiveElement(e.target):null,n?n instanceof HTMLAnchorElement&&this.listener.onLinkActivated(n.href):this.listener.onTap(e),e.stopPropagation(),e.preventDefault()}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}window.addEventListener("message",(n=>{if(n.ports[0]){const s=n.ports[0],i=new t(s);new e(window,i)}}));class t{constructor(e){this.messagePort=e}onTap(e){const t={x:e.clientX,y:e.clientY};this.messagePort.postMessage(t)}onLinkActivated(e){this.messagePort.postMessage({href:e})}}}(); +!function(){"use strict";const e=new MessageChannel;window.parent.postMessage("Init","*",[e.port2]);const t=new class{constructor(e){this.messagePort=e}send(e){this.messagePort.postMessage(e)}}(e.port1),n=function(e){const t=window.document.querySelector("meta[name=viewport]");if(t&&t instanceof HTMLMetaElement)return function(e){const t=/(\w+) *= *([^\s,]+)/g,n=new Map;let s;for(;s=t.exec(e);)null!=s&&n.set(s[1],s[2]);const i=parseFloat(n.get("width")),o=parseFloat(n.get("height"));return i&&o?{width:i,height:o}:void 0}(t.content)}();t.send({kind:"contentSize",size:n});const s=new class{constructor(e){this.messageSender=e}onTap(e){this.messageSender.send({kind:"tap",x:e.clientX,y:e.clientY})}onLinkActivated(e){this.messageSender.send({kind:"linkActivated",href:e})}}(t);new class{constructor(e,t){this.window=e,this.listener=t,document.addEventListener("click",(e=>{this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();if(t&&"Range"==t.type)return;let n;n=e.target instanceof HTMLElement?this.nearestInteractiveElement(e.target):null,n?n instanceof HTMLAnchorElement&&this.listener.onLinkActivated(n.href):this.listener.onTap(e),e.stopPropagation(),e.preventDefault()}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}(window,s)}(); //# sourceMappingURL=fixed-injectable-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map b/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map index d62e03519e..990608b525 100644 --- a/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map +++ b/readium/navigators/web/scripts/dist/fixed-injectable-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAAO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBE,SAASC,iBAAiB,SAAUC,IAChCH,KAAKI,QAAQD,EAAM,IACpB,EACP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAN,EAAMO,kBAAkBC,YACPX,KAAKY,0BAA0BT,EAAMO,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1Bb,KAAKD,SAASe,gBAAgBL,EAAeM,MAIjDf,KAAKD,SAASiB,MAAMb,GAExBA,EAAMc,kBACNd,EAAMe,gBACV,CAEA,yBAAAN,CAA0BO,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACDzB,KAAKY,0BAA0BO,EAAQM,eAE3C,IACX,EC5DJ3B,OAAOI,iBAAiB,WAAYC,IAChC,GAAIA,EAAMuB,MAAM,GAAI,CAChB,MAAMC,EAAcxB,EAAMuB,MAAM,GAC1BE,EAAoB,IAAIC,EAA0BF,GACxD,IAAI/B,EAAiBE,OAAQ8B,EACjC,KAEJ,MAAMC,EACF,WAAAhC,CAAY8B,GACR3B,KAAK2B,YAAcA,CACvB,CACA,KAAAX,CAAMb,GACF,MAAM2B,EAAW,CAAEC,EAAG5B,EAAM6B,QAASC,EAAG9B,EAAM+B,SAC9ClC,KAAK2B,YAAYQ,YAAYL,EACjC,CACA,eAAAhB,CAAgBC,GACZf,KAAK2B,YAAYQ,YAAY,CAAEpB,KAAMA,GACzC,E","sources":["webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/index-fixed-injectable.ts"],"sourcesContent":["export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nwindow.addEventListener(\"message\", (event) => {\n if (event.ports[0]) {\n const messagePort = event.ports[0];\n const messagingListener = new MessagingGesturesListener(messagePort);\n new GesturesDetector(window, messagingListener);\n }\n});\nclass MessagingGesturesListener {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n onTap(event) {\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.messagePort.postMessage(tapEvent);\n }\n onLinkActivated(href) {\n this.messagePort.postMessage({ href: href });\n }\n}\n"],"names":["GesturesDetector","constructor","window","listener","this","document","addEventListener","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","onLinkActivated","href","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","ports","messagePort","messagingListener","MessagingGesturesListener","tapEvent","x","clientX","y","clientY","postMessage"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAWA,MAAMA,EAAiB,IAAIC,eAC3BC,OAAOC,OAAOC,YAAY,OAAQ,IAAK,CAACJ,EAAeK,QACvD,MAAMC,EAAgB,ICbf,MACH,WAAAC,CAAYC,GACRC,KAAKD,YAAcA,CACvB,CACA,IAAAE,CAAKC,GACDF,KAAKD,YAAYJ,YAAYO,EACjC,GDO0CX,EAAeY,OACvDC,EAeN,SAA0BC,GACtB,MAAMC,EAhB4Bb,OAAOY,SAgBfE,cAAc,uBACxC,GAAKD,GAAcA,aAAoBE,gBAGvC,OEAG,SAA6BC,GAChC,MAAMC,EAAQ,uBACRC,EAAa,IAAIC,IACvB,IAAIC,EACJ,KAAQA,EAAQH,EAAMI,KAAKL,IACV,MAATI,GACAF,EAAWI,IAAIF,EAAM,GAAIA,EAAM,IAGvC,MAAMG,EAAQC,WAAWN,EAAWO,IAAI,UAClCC,EAASF,WAAWN,EAAWO,IAAI,WACzC,OAAIF,GAASG,EACF,CAAEH,QAAOG,eAGhB,CAER,CFjBWC,CAAoBd,EAASe,QACxC,CArBqBC,GACrBzB,EAAcI,KAAK,CAAEsB,KAAM,cAAeC,KAAMpB,IAYhD,MAAMqB,EAAoB,IAX1B,MACI,WAAA3B,CAAYD,GACRG,KAAKH,cAAgBA,CACzB,CACA,KAAA6B,CAAMC,GACF3B,KAAKH,cAAcI,KAAK,CAAEsB,KAAM,MAAOK,EAAGD,EAAME,QAASC,EAAGH,EAAMI,SACtE,CACA,eAAAC,CAAgBC,GACZjC,KAAKH,cAAcI,KAAK,CAAEsB,KAAM,gBAAiBU,KAAMA,GAC3D,GAEoDpC,GACxD,IG5BO,MACH,WAAAC,CAAYL,EAAQyC,GAChBlC,KAAKP,OAASA,EACdO,KAAKkC,SAAWA,EAChB7B,SAAS8B,iBAAiB,SAAUR,IAChC3B,KAAKoC,QAAQT,EAAM,IACpB,EACP,CACA,OAAAS,CAAQT,GACJ,GAAIA,EAAMU,iBACN,OAEJ,MAAMC,EAAYtC,KAAKP,OAAO8C,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAd,EAAMe,kBAAkBC,YACP3C,KAAK4C,0BAA0BjB,EAAMe,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1B7C,KAAKkC,SAASF,gBAAgBS,EAAeR,MAIjDjC,KAAKkC,SAASR,MAAMC,GAExBA,EAAMmB,kBACNnB,EAAMoB,gBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACDtD,KAAK4C,0BAA0BI,EAAQM,eAE3C,IACX,GHzCiB7D,OAAQgC,E","sources":["webpack://readium-js/./src/index-fixed-injectable.ts","webpack://readium-js/./src/fixed/iframe-message.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts"],"sourcesContent":["//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nimport { IframeMessageSender } from \"./fixed/iframe-message\";\nimport { parseViewportString } from \"./util/viewport\";\nconst messageChannel = new MessageChannel();\nwindow.parent.postMessage(\"Init\", \"*\", [messageChannel.port2]);\nconst messageSender = new IframeMessageSender(messageChannel.port1);\nconst viewportSize = parseContentSize(window.document);\nmessageSender.send({ kind: \"contentSize\", size: viewportSize });\nclass MessagingGesturesListener {\n constructor(messageSender) {\n this.messageSender = messageSender;\n }\n onTap(event) {\n this.messageSender.send({ kind: \"tap\", x: event.clientX, y: event.clientY });\n }\n onLinkActivated(href) {\n this.messageSender.send({ kind: \"linkActivated\", href: href });\n }\n}\nconst messagingListener = new MessagingGesturesListener(messageSender);\nnew GesturesDetector(window, messagingListener);\nfunction parseContentSize(document) {\n const viewport = document.querySelector(\"meta[name=viewport]\");\n if (!viewport || !(viewport instanceof HTMLMetaElement)) {\n return undefined;\n }\n return parseViewportString(viewport.content);\n}\n","export class IframeMessageSender {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n send(message) {\n this.messagePort.postMessage(message);\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\nexport function parseViewportString(viewportString) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportString))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n"],"names":["messageChannel","MessageChannel","window","parent","postMessage","port2","messageSender","constructor","messagePort","this","send","message","port1","viewportSize","document","viewport","querySelector","HTMLMetaElement","viewportString","regex","properties","Map","match","exec","set","width","parseFloat","get","height","parseViewportString","content","parseContentSize","kind","size","messagingListener","onTap","event","x","clientX","y","clientY","onLinkActivated","href","listener","addEventListener","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-single-script.js b/readium/navigators/web/scripts/dist/fixed-single-script.js index 5bef878855..123e469a47 100644 --- a/readium/navigators/web/scripts/dist/fixed-single-script.js +++ b/readium/navigators/web/scripts/dist/fixed-single-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}),{once:!0})}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y?this.listener.onTap({x:t.data.x,y:t.data.y}):t.data.href&&this.listener.onLinkActivated(t.data.href)}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),a=parseFloat(i.get("height"));return n&&a?{width:n,height:a}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};a.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}}),this.metaViewport=n;const h={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};a.onTap(i)},onLinkActivated:t=>{a.onLinkActivated(t)}};this.page=new t(e,s,h)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page"),h=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,a){const h=new n(a);this.manager=new s(t,e,i,h)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,window.gestures)}(); +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e}setMessagePort(t){t.onmessage=t=>{this.onMessageFromIframe(t)}}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onMessageFromIframe(t){const e=t.data;switch(e.kind){case"contentSize":return this.onContentSizeAvailable(e.size);case"tap":return this.listener.onTap({x:e.x,y:e.y});case"linkActivated":return this.listener.onLinkActivated(e.href)}}onContentSizeAvailable(t){t&&(this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t,this.listener.onIframeLoaded())}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,e.addEventListener("message",(t=>{t.source===s.contentWindow&&t.ports[0]&&this.page.setMessagePort(t.ports[0])})),new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};a.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}}),this.metaViewport=n;const h={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};a.onTap(i)},onLinkActivated:t=>{a.onLinkActivated(t)}};this.page=new t(e,s,h)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page"),h=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,a){const h=new n(a);this.manager=new s(t,e,i,h)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,window.gestures)}(); //# sourceMappingURL=fixed-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-single-script.js.map b/readium/navigators/web/scripts/dist/fixed-single-script.js.map index f848f29406..92eafc1dc0 100644 --- a/readium/navigators/web/scripts/dist/fixed-single-script.js.map +++ b/readium/navigators/web/scripts/dist/fixed-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-single-script.js","mappings":"yBACO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,EAAQC,GAGxB,GAFAC,KAAKC,QAAU,CAAEC,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GACpDL,KAAKM,QAAU,IAAIC,gBACdT,EAAOU,cACR,MAAMC,MAAM,mDAEhBT,KAAKD,SAAWA,EAChBC,KAAKF,OAASA,EACdE,KAAKF,OAAOY,iBAAiB,QAAQ,KACjCV,KAAKW,gBAAgB,GACtB,CAAEC,MAAM,GACf,CACA,IAAAC,GACIb,KAAKF,OAAOgB,MAAMC,QAAU,OAChC,CACA,IAAAC,GACIhB,KAAKF,OAAOgB,MAAMC,QAAU,MAChC,CAEA,UAAAE,CAAWhB,GACHD,KAAKC,SAAWA,IAGpBD,KAAKF,OAAOgB,MAAMI,UAAYlB,KAAKC,QAAQC,IAAM,KACjDF,KAAKF,OAAOgB,MAAMK,WAAanB,KAAKC,QAAQI,KAAO,KACnDL,KAAKF,OAAOgB,MAAMM,aAAepB,KAAKC,QAAQG,OAAS,KACvDJ,KAAKF,OAAOgB,MAAMO,YAAcrB,KAAKC,QAAQE,MAAQ,KACzD,CAEA,QAAAmB,CAASC,GACLvB,KAAKF,OAAO0B,IAAMD,CACtB,CAEA,cAAAE,CAAeC,GACX1B,KAAKF,OAAOgB,MAAMa,WAAa,SAC/B3B,KAAKF,OAAOgB,MAAMc,MAAQF,EAAKE,MAAQ,KACvC5B,KAAKF,OAAOgB,MAAMe,OAASH,EAAKG,OAAS,KACzC7B,KAAK0B,KAAOA,CAChB,CACA,cAAAf,GACI,MAAMmB,EAAW9B,KAAKF,OAAOU,cAAcuB,SAASC,cAAc,uBAClE,IAAKF,GAAYA,aAAoBG,gBAEjC,OAEJ,MAAMC,EAAWlC,KAAKmC,cAAcL,GAC/BI,IAILlC,KAAKF,OAAOgB,MAAMc,MAAQM,EAASN,MAAQ,KAC3C5B,KAAKF,OAAOgB,MAAMe,OAASK,EAASL,OAAS,KAC7C7B,KAAK0B,KAAOQ,EACZlC,KAAKM,QAAQ8B,MAAMC,UAAaC,IAC5BtC,KAAKuC,oBAAoBD,EAAQ,EAErCtC,KAAKF,OAAOU,cAAcgC,YAAY,OAAQ,IAAK,CAACxC,KAAKM,QAAQmC,QACjEzC,KAAKD,SAASY,iBAClB,CACA,mBAAA4B,CAAoBD,GACZA,EAAQI,KAAKC,GAAKL,EAAQI,KAAKE,EAC/B5C,KAAKD,SAAS8C,MAAM,CAAEF,EAAGL,EAAQI,KAAKC,EAAGC,EAAGN,EAAQI,KAAKE,IAEpDN,EAAQI,KAAKI,MAClB9C,KAAKD,SAASgD,gBAAgBT,EAAQI,KAAKI,KAEnD,CAEA,aAAAX,CAAca,GACV,MAAMC,EAAQ,uBACRC,EAAa,IAAIC,IACvB,IAAIC,EACJ,KAAQA,EAAQH,EAAMI,KAAKL,EAAaM,UACvB,MAATF,GACAF,EAAWK,IAAIH,EAAM,GAAIA,EAAM,IAGvC,MAAMxB,EAAQ4B,WAAWN,EAAWO,IAAI,UAClC5B,EAAS2B,WAAWN,EAAWO,IAAI,WACzC,OAAI7B,GAASC,EACF,CAAED,QAAOC,eAGhB,CAER,ECvFG,MAAM6B,EACT,eAAAC,CAAgBC,GAEZ,OADA5D,KAAK6D,aAAeD,EACb5D,IACX,CACA,eAAA8D,CAAgBF,GAEZ,OADA5D,KAAK+D,aAAeH,EACb5D,IACX,CACA,QAAAgE,CAASpC,GAEL,OADA5B,KAAK4B,MAAQA,EACN5B,IACX,CACA,SAAAiE,CAAUpC,GAEN,OADA7B,KAAK6B,OAASA,EACP7B,IACX,CACA,KAAAkE,GACI,MAAMC,EAAa,GAanB,OAZInE,KAAK6D,cACLM,EAAWC,KAAK,iBAAmBpE,KAAK6D,cAExC7D,KAAK+D,cACLI,EAAWC,KAAK,iBAAmBpE,KAAK+D,cAExC/D,KAAK4B,OACLuC,EAAWC,KAAK,SAAWpE,KAAK4B,OAEhC5B,KAAK6B,QACLsC,EAAWC,KAAK,UAAYpE,KAAK6B,QAE9BsC,EAAWE,KAAK,KAC3B,EChCG,MAAMC,EACT,WAAA1E,CAAYC,EAAQE,GAChBC,KAAKH,OAASA,EACdG,KAAKD,SAAWA,EAChBgC,SAASrB,iBAAiB,SAAU6D,IAChCvE,KAAKwE,QAAQD,EAAM,IACpB,EACP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAY1E,KAAKH,OAAO8E,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAN,EAAMO,kBAAkBC,YACP/E,KAAKgF,0BAA0BT,EAAMO,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1BjF,KAAKD,SAASgD,gBAAgB8B,EAAe/B,MAIjD9C,KAAKD,SAAS8C,MAAM0B,GAExBA,EAAMW,kBACNX,EAAMY,gBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACD1F,KAAKgF,0BAA0BI,EAAQM,eAE3C,IACX,ECjEG,MAAMC,EACT,WAAA/F,CAAYC,EAAQC,EAAQ8F,EAAc7F,GACtCC,KAAK6F,IAAM,UACX7F,KAAK8F,OAAS,CAAE5F,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GACnDL,KAAK4D,MAAQ,EAeb,IAAIU,EAAiBzE,EAdW,CAC5BgD,MAAQ0B,IACJ,MAAMwB,EAAW,CACbpD,GAAI4B,EAAMyB,QAAUC,eAAeC,YAC/BD,eAAerC,MACnBhB,GAAI2B,EAAM4B,QAAUF,eAAeG,WAAaH,eAAerC,OAEnE7D,EAAS8C,MAAMkD,EAAS,EAG5BhD,gBAAkBsD,IACd,MAAM5F,MAAM,+CAA+C,IAInET,KAAK4F,aAAeA,EACpB,MAAMU,EAAe,CACjB3F,eAAgB,KACZX,KAAKW,gBAAgB,EAEzBkC,MAAQ0B,IACJ,MAAMgC,EAAezG,EAAO0G,wBACtBT,EAAW,CACbpD,GAAI4B,EAAM5B,EAAI4D,EAAalG,KAAO4F,eAAeC,YAC7CD,eAAerC,MACnBhB,GAAI2B,EAAM3B,EAAI2D,EAAarG,IAAM+F,eAAeG,WAC5CH,eAAerC,OAEvB7D,EAAS8C,MAAMkD,EAAS,EAE5BhD,gBAAkBD,IACd/C,EAASgD,gBAAgBD,EAAK,GAGtC9C,KAAKyG,KAAO,IAAI9G,EAAYE,EAAQC,EAAQwG,EAChD,CACA,WAAAI,CAAY5E,EAAUgE,GACd9F,KAAK8B,UAAYA,GAAY9B,KAAK8F,QAAUA,IAGhD9F,KAAK8B,SAAWA,EAChB9B,KAAK8F,OAASA,EACd9F,KAAK2G,SACT,CACA,MAAAC,CAAOf,GACC7F,KAAK6F,KAAOA,IAGhB7F,KAAK6F,IAAMA,EACX7F,KAAK2G,SACT,CACA,YAAAE,CAAatF,GACTvB,KAAKyG,KAAKzF,OACVhB,KAAKyG,KAAKnF,SAASC,EACvB,CACA,cAAAZ,GACSX,KAAKyG,KAAK/E,MAIX1B,KAAK2G,QAEb,CACA,MAAAA,GACI,IAAK3G,KAAKyG,KAAK/E,OAAS1B,KAAK8B,SACzB,OAEJ,MAAM7B,EAAU,CACZC,IAAKF,KAAK8F,OAAO5F,IACjBC,MAAOH,KAAK8F,OAAO3F,MACnBC,OAAQJ,KAAK8F,OAAO1F,OACpBC,KAAML,KAAK8F,OAAOzF,MAEtBL,KAAKyG,KAAKxF,WAAWhB,GACrB,MAAM6G,EAAkB,CACpBlF,MAAO5B,KAAK8B,SAASF,MAAQ5B,KAAK8F,OAAOzF,KAAOL,KAAK8F,OAAO3F,MAC5D0B,OAAQ7B,KAAK8B,SAASD,OAAS7B,KAAK8F,OAAO5F,IAAMF,KAAK8F,OAAO1F,QAE3DwD,ECvFP,SAAsBiC,EAAKvC,EAASyD,GACvC,OAAQlB,GACJ,IAAK,UACD,OAOZ,SAAoBvC,EAASyD,GACzB,MAAMC,EAAaD,EAAUnF,MAAQ0B,EAAQ1B,MACvCqF,EAAcF,EAAUlF,OAASyB,EAAQzB,OAC/C,OAAOqF,KAAKC,IAAIH,EAAYC,EAChC,CAXmBG,CAAW9D,EAASyD,GAC/B,IAAK,QACD,OAUZ,SAAkBzD,EAASyD,GACvB,OAAOA,EAAUnF,MAAQ0B,EAAQ1B,KACrC,CAZmByF,CAAS/D,EAASyD,GAC7B,IAAK,SACD,OAWZ,SAAmBzD,EAASyD,GACxB,OAAOA,EAAUlF,OAASyB,EAAQzB,MACtC,CAbmByF,CAAUhE,EAASyD,GAEtC,CD8EsBQ,CAAavH,KAAK6F,IAAK7F,KAAKyG,KAAK/E,KAAMoF,GACrD9G,KAAK4F,aAAatC,SAAU,IAAII,GAC3BC,gBAAgBC,GAChBE,gBAAgBF,GAChBI,SAAShE,KAAKyG,KAAK/E,KAAKE,OACxBqC,UAAUjE,KAAKyG,KAAK/E,KAAKG,QACzBqC,QACLlE,KAAK4D,MAAQA,EACb5D,KAAKyG,KAAK5F,MACd,EEhGG,MAAM2G,EACT,WAAA5H,CAAY6H,GACRzH,KAAK0H,UAAYD,CACrB,CACA,KAAA5E,CAAM0B,GACFvE,KAAK0H,UAAU7E,MAAM8E,KAAKC,UAAUrD,GACxC,CACA,eAAAxB,CAAgBD,GACZ9C,KAAK0H,UAAU3E,gBAAgBD,EACnC,ECHJ,MAAMhD,EAASiC,SAAS8F,eAAe,QACjCjC,EAAe7D,SAASC,cAAc,uBAC5CnC,OAAOiI,WAAa,ICNb,MACH,WAAAlI,CAAYC,EAAQC,EAAQ8F,EAAcmC,GACtC,MAAMhI,EAAW,IAAIyH,EAAsBO,GAC3C/H,KAAKgI,QAAU,IAAIrC,EAAkB9F,EAAQC,EAAQ8F,EAAc7F,EACvE,CACA,YAAA8G,CAAatF,GACTvB,KAAKgI,QAAQnB,aAAatF,EAC9B,CACA,WAAAmF,CAAYuB,EAAgBC,EAAgBC,EAAUC,EAAYC,EAAaC,GAC3E,MAAMxG,EAAW,CAAEF,MAAOqG,EAAgBpG,OAAQqG,GAC5CpC,EAAS,CACX5F,IAAKiI,EACL9H,KAAMiI,EACNlI,OAAQiI,EACRlI,MAAOiI,GAEXpI,KAAKgI,QAAQtB,YAAY5E,EAAUgE,EACvC,CACA,MAAAc,CAAOf,GACH,GAAW,WAAPA,GAA2B,SAAPA,GAAyB,UAAPA,EACtC,MAAMpF,MAAM,sBAAsBoF,KAEtC7F,KAAKgI,QAAQpB,OAAOf,EACxB,GDjBsChG,OAAQC,EAAQ8F,EAAc/F,OAAOkI,S","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n }, { once: true });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n else if (message.data.href) {\n this.listener.onLinkActivated(message.data.href);\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n const boundingRect = iframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","once","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","onMessageFromIframe","postMessage","port2","data","x","y","onTap","href","onLinkActivated","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","SingleAreaManager","metaViewport","fit","insets","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","pageListener","boundingRect","getBoundingClientRect","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n }\n setMessagePort(messagePort) {\n messagePort.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onMessageFromIframe(event) {\n const message = event.data;\n switch (message.kind) {\n case \"contentSize\":\n return this.onContentSizeAvailable(message.size);\n case \"tap\":\n return this.listener.onTap({ x: message.x, y: message.y });\n case \"linkActivated\":\n return this.listener.onLinkActivated(message.href);\n }\n }\n onContentSizeAvailable(size) {\n if (!size) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n this.listener.onIframeLoaded();\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\nexport function parseViewportString(viewportString) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportString))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n window.addEventListener(\"message\", (event) => {\n if (event.source === iframe.contentWindow && event.ports[0]) {\n this.page.setMessagePort(event.ports[0]);\n }\n });\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n const boundingRect = iframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","setMessagePort","messagePort","onmessage","message","onMessageFromIframe","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","event","data","kind","onContentSizeAvailable","onTap","x","y","onLinkActivated","href","onIframeLoaded","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","document","addEventListener","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","SingleAreaManager","metaViewport","fit","insets","source","ports","page","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","pageListener","boundingRect","getBoundingClientRect","setViewport","viewport","layout","setFit","loadResource","safeDrawingSize","content","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","querySelector","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/src/fixed/double-area-manager.ts b/readium/navigators/web/scripts/src/fixed/double-area-manager.ts index 601d263317..7e8b647bdc 100644 --- a/readium/navigators/web/scripts/src/fixed/double-area-manager.ts +++ b/readium/navigators/web/scripts/src/fixed/double-area-manager.ts @@ -28,6 +28,18 @@ export class DoubleAreaManager { metaViewport: HTMLMetaElement, listener: AreaManager.Listener ) { + window.addEventListener("message", (event) => { + if (!event.ports[0]) { + return + } + + if (event.source === leftIframe.contentWindow) { + this.leftPage.setMessagePort(event.ports[0]) + } else if (event.source == rightIframe.contentWindow) { + this.rightPage.setMessagePort(event.ports[0]) + } + }) + const wrapperGesturesListener = { onTap: (event: MouseEvent) => { const tapEvent = { diff --git a/readium/navigators/web/scripts/src/fixed/iframe-message.ts b/readium/navigators/web/scripts/src/fixed/iframe-message.ts new file mode 100644 index 0000000000..0a268750ec --- /dev/null +++ b/readium/navigators/web/scripts/src/fixed/iframe-message.ts @@ -0,0 +1,34 @@ +import { Size } from "../common/types" + +interface ContentSizeMessage { + kind: "contentSize" + size?: Size +} + +interface TapMessage { + kind: "tap" + x: number + y: number +} + +interface LinkActivatedMessage { + kind: "linkActivated" + href: string +} + +export type IframeMessage = + | ContentSizeMessage + | TapMessage + | LinkActivatedMessage + +export class IframeMessageSender { + private messagePort: MessagePort + + constructor(messagePort: MessagePort) { + this.messagePort = messagePort + } + + send(message: IframeMessage) { + this.messagePort.postMessage(message) + } +} diff --git a/readium/navigators/web/scripts/src/fixed/page-manager.ts b/readium/navigators/web/scripts/src/fixed/page-manager.ts index 2926ccb78e..8a0708d6f2 100644 --- a/readium/navigators/web/scripts/src/fixed/page-manager.ts +++ b/readium/navigators/web/scripts/src/fixed/page-manager.ts @@ -1,5 +1,6 @@ import { Margins, Size } from "../common/types" import { TapEvent } from "../common/events" +import { IframeMessage } from "./iframe-message" /** Manages a fixed layout resource embedded in an iframe. */ export class PageManager { @@ -9,7 +10,7 @@ export class PageManager { private margins: Margins = { top: 0, right: 0, bottom: 0, left: 0 } - private readonly channel = new MessageChannel() + private messagePort?: MessagePort size?: Size @@ -24,13 +25,12 @@ export class PageManager { this.listener = listener this.iframe = iframe - this.iframe.addEventListener( - "load", - () => { - this.onIframeLoaded() - }, - { once: true } - ) + } + + setMessagePort(messagePort: MessagePort) { + messagePort.onmessage = (message) => { + this.onMessageFromIframe(message) + } } show() { @@ -66,59 +66,29 @@ export class PageManager { this.size = size } - private onIframeLoaded() { - const viewport = this.iframe.contentWindow!.document.querySelector( - "meta[name=viewport]" - ) - if (!viewport || viewport! instanceof HTMLMetaElement) { - //FIXME: handle edge case - return + private onMessageFromIframe(event: MessageEvent) { + const message = event.data as IframeMessage + switch (message.kind) { + case "contentSize": + return this.onContentSizeAvailable(message.size) + case "tap": + return this.listener.onTap({ x: message.x, y: message.y }) + case "linkActivated": + return this.listener.onLinkActivated(message.href) } + } - const pageSize = this.parsePageSize(viewport as HTMLMetaElement) - if (!pageSize) { + private onContentSizeAvailable(size?: Size) { + if (!size) { //FIXME: handle edge case return } - this.iframe.style.width = pageSize.width + "px" - this.iframe.style.height = pageSize.height + "px" - this.size = pageSize - - this.channel.port1.onmessage = (message) => { - this.onMessageFromIframe(message) - } - this.iframe.contentWindow!.postMessage("Init", "*", [this.channel.port2]) + this.iframe.style.width = size.width + "px" + this.iframe.style.height = size.height + "px" + this.size = size this.listener.onIframeLoaded() } - - private onMessageFromIframe(message: MessageEvent) { - if (message.data.x && message.data.y) { - this.listener.onTap({ x: message.data.x, y: message.data.y }) - } else if (message.data.href) { - this.listener.onLinkActivated(message.data.href) - } - } - - /** Parses the page size from the viewport meta tag of the loaded resource. */ - private parsePageSize(viewportMeta: HTMLMetaElement): Size | undefined { - const regex = /(\w+) *= *([^\s,]+)/g - const properties = new Map() - let match - while ((match = regex.exec(viewportMeta.content))) { - if (match != null) { - properties.set(match[1], match[2]) - } - } - const width = parseFloat(properties.get("width")) - const height = parseFloat(properties.get("height")) - - if (width && height) { - return { width, height } - } else { - return undefined - } - } } export namespace PageManager { diff --git a/readium/navigators/web/scripts/src/fixed/single-area-manager.ts b/readium/navigators/web/scripts/src/fixed/single-area-manager.ts index 92fe435e73..3b41995bd6 100644 --- a/readium/navigators/web/scripts/src/fixed/single-area-manager.ts +++ b/readium/navigators/web/scripts/src/fixed/single-area-manager.ts @@ -25,6 +25,12 @@ export class SingleAreaManager { metaViewport: HTMLMetaElement, listener: AreaManager.Listener ) { + window.addEventListener("message", (event) => { + if (event.source === iframe.contentWindow && event.ports[0]) { + this.page.setMessagePort(event.ports[0]) + } + }) + const wrapperGesturesListener = { onTap: (event: MouseEvent) => { const tapEvent = { diff --git a/readium/navigators/web/scripts/src/index-fixed-injectable.ts b/readium/navigators/web/scripts/src/index-fixed-injectable.ts index 0e0e4c3a75..35ac30a5b4 100644 --- a/readium/navigators/web/scripts/src/index-fixed-injectable.ts +++ b/readium/navigators/web/scripts/src/index-fixed-injectable.ts @@ -9,28 +9,42 @@ */ import { GesturesDetector, GesturesListener } from "./common/gestures" +import { Size } from "./common/types" +import { IframeMessageSender } from "./fixed/iframe-message" +import { parseViewportString } from "./util/viewport" -window.addEventListener("message", (event) => { - if (event.ports[0]) { - const messagePort = event.ports[0] - const messagingListener = new MessagingGesturesListener(messagePort) - new GesturesDetector(window, messagingListener) - } -}) +const messageChannel = new MessageChannel() +window.parent.postMessage("Init", "*", [messageChannel.port2]) +const messageSender = new IframeMessageSender(messageChannel.port1) + +const viewportSize = parseContentSize(window.document) +messageSender.send({ kind: "contentSize", size: viewportSize }) class MessagingGesturesListener implements GesturesListener { - readonly messagePort: MessagePort + readonly messageSender: IframeMessageSender - constructor(messagePort: MessagePort) { - this.messagePort = messagePort + constructor(messageSender: IframeMessageSender) { + this.messageSender = messageSender } onTap(event: MouseEvent): void { - const tapEvent = { x: event.clientX, y: event.clientY } - this.messagePort.postMessage(tapEvent) + this.messageSender.send({ kind: "tap", x: event.clientX, y: event.clientY }) } onLinkActivated(href: string): void { - this.messagePort.postMessage({ href: href }) + this.messageSender.send({ kind: "linkActivated", href: href }) + } +} + +const messagingListener = new MessagingGesturesListener(messageSender) +new GesturesDetector(window, messagingListener) + +function parseContentSize(document: Document): Size | undefined { + const viewport = document.querySelector("meta[name=viewport]") + + if (!viewport || !(viewport instanceof HTMLMetaElement)) { + return undefined } + + return parseViewportString(viewport.content) } diff --git a/readium/navigators/web/scripts/src/util/viewport.ts b/readium/navigators/web/scripts/src/util/viewport.ts index 0482441f93..958fdb5445 100644 --- a/readium/navigators/web/scripts/src/util/viewport.ts +++ b/readium/navigators/web/scripts/src/util/viewport.ts @@ -1,3 +1,5 @@ +import { Size } from "../common/types" + export class ViewportStringBuilder { private initialScale?: number @@ -49,3 +51,21 @@ export class ViewportStringBuilder { return components.join(", ") } } + +export function parseViewportString(viewportString: string): Size | undefined { + const regex = /(\w+) *= *([^\s,]+)/g + const properties = new Map() + let match + while ((match = regex.exec(viewportString))) { + if (match != null) { + properties.set(match[1], match[2]) + } + } + const width = parseFloat(properties.get("width")) + const height = parseFloat(properties.get("height")) + if (width && height) { + return { width, height } + } else { + return undefined + } +} diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js index 7a962b418e..9bd7f2adc7 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}),{once:!0})}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y?this.listener.onTap({x:t.data.x,y:t.data.y}):t.data.href&&this.listener.onLinkActivated(t.data.href)}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),a=parseFloat(i.get("height"));return n&&a?{width:n,height:a}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a,h){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};h.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}},r={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=n.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,n,r),this.metaViewport=a}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,n=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:n},h={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,a,h);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(n).build(),this.leftPage.show(),this.rightPage.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page-left"),h=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,a,h){const o=new n(h);this.manager=new s(t,e,i,a,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,o,window.gestures)}(); +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e}setMessagePort(t){t.onmessage=t=>{this.onMessageFromIframe(t)}}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onMessageFromIframe(t){const e=t.data;switch(e.kind){case"contentSize":return this.onContentSizeAvailable(e.size);case"tap":return this.listener.onTap({x:e.x,y:e.y});case"linkActivated":return this.listener.onLinkActivated(e.href)}}onContentSizeAvailable(t){t&&(this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t,this.listener.onIframeLoaded())}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a,h){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},e.addEventListener("message",(t=>{t.ports[0]&&(t.source===s.contentWindow?this.leftPage.setMessagePort(t.ports[0]):t.source==n.contentWindow&&this.rightPage.setMessagePort(t.ports[0]))})),new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};h.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}},r={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=n.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,n,r),this.metaViewport=a}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,n=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:n},h={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,a,h);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(n).build(),this.leftPage.show(),this.rightPage.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page-left"),h=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,a,h){const o=new n(h);this.manager=new s(t,e,i,a,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,o,window.gestures)}(); //# sourceMappingURL=fixed-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map index 4c767d157c..a79f0cc918 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n }, { once: true });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n else if (message.data.href) {\n this.listener.onLinkActivated(message.data.href);\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const leftPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = leftIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n const rightPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = rightIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, leftPageListener);\n this.rightPage = new PageManager(window, rightIframe, rightPageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","once","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","onMessageFromIframe","postMessage","port2","data","x","y","onTap","href","onLinkActivated","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","leftPageListener","layout","boundingRect","getBoundingClientRect","rightPageListener","leftPage","rightPage","loadSpread","spread","setViewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n }\n setMessagePort(messagePort) {\n messagePort.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onMessageFromIframe(event) {\n const message = event.data;\n switch (message.kind) {\n case \"contentSize\":\n return this.onContentSizeAvailable(message.size);\n case \"tap\":\n return this.listener.onTap({ x: message.x, y: message.y });\n case \"linkActivated\":\n return this.listener.onLinkActivated(message.href);\n }\n }\n onContentSizeAvailable(size) {\n if (!size) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n this.listener.onIframeLoaded();\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\nexport function parseViewportString(viewportString) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportString))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n window.addEventListener(\"message\", (event) => {\n if (!event.ports[0]) {\n return;\n }\n if (event.source === leftIframe.contentWindow) {\n this.leftPage.setMessagePort(event.ports[0]);\n }\n else if (event.source == rightIframe.contentWindow) {\n this.rightPage.setMessagePort(event.ports[0]);\n }\n });\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const leftPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = leftIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n const rightPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = rightIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, leftPageListener);\n this.rightPage = new PageManager(window, rightIframe, rightPageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","setMessagePort","messagePort","onmessage","message","onMessageFromIframe","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","event","data","kind","onContentSizeAvailable","onTap","x","y","onLinkActivated","href","onIframeLoaded","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","document","addEventListener","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","ports","source","leftPage","rightPage","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","leftPageListener","layout","boundingRect","getBoundingClientRect","rightPageListener","loadSpread","spread","setViewport","viewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","content","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","querySelector","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js index 85480a39eb..61b11ef4c1 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class e{constructor(e,t){this.window=e,this.listener=t,document.addEventListener("click",(e=>{this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();if(t&&"Range"==t.type)return;let n;n=e.target instanceof HTMLElement?this.nearestInteractiveElement(e.target):null,n?n instanceof HTMLAnchorElement&&this.listener.onLinkActivated(n.href):this.listener.onTap(e),e.stopPropagation(),e.preventDefault()}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}window.addEventListener("message",(n=>{if(n.ports[0]){const s=n.ports[0],i=new t(s);new e(window,i)}}));class t{constructor(e){this.messagePort=e}onTap(e){const t={x:e.clientX,y:e.clientY};this.messagePort.postMessage(t)}onLinkActivated(e){this.messagePort.postMessage({href:e})}}}(); +!function(){"use strict";const e=new MessageChannel;window.parent.postMessage("Init","*",[e.port2]);const t=new class{constructor(e){this.messagePort=e}send(e){this.messagePort.postMessage(e)}}(e.port1),n=function(e){const t=window.document.querySelector("meta[name=viewport]");if(t&&t instanceof HTMLMetaElement)return function(e){const t=/(\w+) *= *([^\s,]+)/g,n=new Map;let s;for(;s=t.exec(e);)null!=s&&n.set(s[1],s[2]);const i=parseFloat(n.get("width")),o=parseFloat(n.get("height"));return i&&o?{width:i,height:o}:void 0}(t.content)}();t.send({kind:"contentSize",size:n});const s=new class{constructor(e){this.messageSender=e}onTap(e){this.messageSender.send({kind:"tap",x:e.clientX,y:e.clientY})}onLinkActivated(e){this.messageSender.send({kind:"linkActivated",href:e})}}(t);new class{constructor(e,t){this.window=e,this.listener=t,document.addEventListener("click",(e=>{this.onClick(e)}),!1)}onClick(e){if(e.defaultPrevented)return;const t=this.window.getSelection();if(t&&"Range"==t.type)return;let n;n=e.target instanceof HTMLElement?this.nearestInteractiveElement(e.target):null,n?n instanceof HTMLAnchorElement&&this.listener.onLinkActivated(n.href):this.listener.onTap(e),e.stopPropagation(),e.preventDefault()}nearestInteractiveElement(e){return null==e?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(e.nodeName.toLowerCase())||e.hasAttribute("contenteditable")&&"false"!=e.getAttribute("contenteditable").toLowerCase()?e:e.parentElement?this.nearestInteractiveElement(e.parentElement):null}}(window,s)}(); //# sourceMappingURL=fixed-injectable-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map index d62e03519e..990608b525 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-injectable-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAAO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,GAChBC,KAAKF,OAASA,EACdE,KAAKD,SAAWA,EAChBE,SAASC,iBAAiB,SAAUC,IAChCH,KAAKI,QAAQD,EAAM,IACpB,EACP,CACA,OAAAC,CAAQD,GACJ,GAAIA,EAAME,iBACN,OAEJ,MAAMC,EAAYN,KAAKF,OAAOS,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAN,EAAMO,kBAAkBC,YACPX,KAAKY,0BAA0BT,EAAMO,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1Bb,KAAKD,SAASe,gBAAgBL,EAAeM,MAIjDf,KAAKD,SAASiB,MAAMb,GAExBA,EAAMc,kBACNd,EAAMe,gBACV,CAEA,yBAAAN,CAA0BO,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACDzB,KAAKY,0BAA0BO,EAAQM,eAE3C,IACX,EC5DJ3B,OAAOI,iBAAiB,WAAYC,IAChC,GAAIA,EAAMuB,MAAM,GAAI,CAChB,MAAMC,EAAcxB,EAAMuB,MAAM,GAC1BE,EAAoB,IAAIC,EAA0BF,GACxD,IAAI/B,EAAiBE,OAAQ8B,EACjC,KAEJ,MAAMC,EACF,WAAAhC,CAAY8B,GACR3B,KAAK2B,YAAcA,CACvB,CACA,KAAAX,CAAMb,GACF,MAAM2B,EAAW,CAAEC,EAAG5B,EAAM6B,QAASC,EAAG9B,EAAM+B,SAC9ClC,KAAK2B,YAAYQ,YAAYL,EACjC,CACA,eAAAhB,CAAgBC,GACZf,KAAK2B,YAAYQ,YAAY,CAAEpB,KAAMA,GACzC,E","sources":["webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/index-fixed-injectable.ts"],"sourcesContent":["export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nwindow.addEventListener(\"message\", (event) => {\n if (event.ports[0]) {\n const messagePort = event.ports[0];\n const messagingListener = new MessagingGesturesListener(messagePort);\n new GesturesDetector(window, messagingListener);\n }\n});\nclass MessagingGesturesListener {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n onTap(event) {\n const tapEvent = { x: event.clientX, y: event.clientY };\n this.messagePort.postMessage(tapEvent);\n }\n onLinkActivated(href) {\n this.messagePort.postMessage({ href: href });\n }\n}\n"],"names":["GesturesDetector","constructor","window","listener","this","document","addEventListener","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","onLinkActivated","href","onTap","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","ports","messagePort","messagingListener","MessagingGesturesListener","tapEvent","x","clientX","y","clientY","postMessage"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-injectable-script.js","mappings":"yBAWA,MAAMA,EAAiB,IAAIC,eAC3BC,OAAOC,OAAOC,YAAY,OAAQ,IAAK,CAACJ,EAAeK,QACvD,MAAMC,EAAgB,ICbf,MACH,WAAAC,CAAYC,GACRC,KAAKD,YAAcA,CACvB,CACA,IAAAE,CAAKC,GACDF,KAAKD,YAAYJ,YAAYO,EACjC,GDO0CX,EAAeY,OACvDC,EAeN,SAA0BC,GACtB,MAAMC,EAhB4Bb,OAAOY,SAgBfE,cAAc,uBACxC,GAAKD,GAAcA,aAAoBE,gBAGvC,OEAG,SAA6BC,GAChC,MAAMC,EAAQ,uBACRC,EAAa,IAAIC,IACvB,IAAIC,EACJ,KAAQA,EAAQH,EAAMI,KAAKL,IACV,MAATI,GACAF,EAAWI,IAAIF,EAAM,GAAIA,EAAM,IAGvC,MAAMG,EAAQC,WAAWN,EAAWO,IAAI,UAClCC,EAASF,WAAWN,EAAWO,IAAI,WACzC,OAAIF,GAASG,EACF,CAAEH,QAAOG,eAGhB,CAER,CFjBWC,CAAoBd,EAASe,QACxC,CArBqBC,GACrBzB,EAAcI,KAAK,CAAEsB,KAAM,cAAeC,KAAMpB,IAYhD,MAAMqB,EAAoB,IAX1B,MACI,WAAA3B,CAAYD,GACRG,KAAKH,cAAgBA,CACzB,CACA,KAAA6B,CAAMC,GACF3B,KAAKH,cAAcI,KAAK,CAAEsB,KAAM,MAAOK,EAAGD,EAAME,QAASC,EAAGH,EAAMI,SACtE,CACA,eAAAC,CAAgBC,GACZjC,KAAKH,cAAcI,KAAK,CAAEsB,KAAM,gBAAiBU,KAAMA,GAC3D,GAEoDpC,GACxD,IG5BO,MACH,WAAAC,CAAYL,EAAQyC,GAChBlC,KAAKP,OAASA,EACdO,KAAKkC,SAAWA,EAChB7B,SAAS8B,iBAAiB,SAAUR,IAChC3B,KAAKoC,QAAQT,EAAM,IACpB,EACP,CACA,OAAAS,CAAQT,GACJ,GAAIA,EAAMU,iBACN,OAEJ,MAAMC,EAAYtC,KAAKP,OAAO8C,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADAd,EAAMe,kBAAkBC,YACP3C,KAAK4C,0BAA0BjB,EAAMe,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1B7C,KAAKkC,SAASF,gBAAgBS,EAAeR,MAIjDjC,KAAKkC,SAASR,MAAMC,GAExBA,EAAMmB,kBACNnB,EAAMoB,gBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACDtD,KAAK4C,0BAA0BI,EAAQM,eAE3C,IACX,GHzCiB7D,OAAQgC,E","sources":["webpack://readium-js/./src/index-fixed-injectable.ts","webpack://readium-js/./src/fixed/iframe-message.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts"],"sourcesContent":["//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\n/**\n * Script loaded by fixed layout resources.\n */\nimport { GesturesDetector } from \"./common/gestures\";\nimport { IframeMessageSender } from \"./fixed/iframe-message\";\nimport { parseViewportString } from \"./util/viewport\";\nconst messageChannel = new MessageChannel();\nwindow.parent.postMessage(\"Init\", \"*\", [messageChannel.port2]);\nconst messageSender = new IframeMessageSender(messageChannel.port1);\nconst viewportSize = parseContentSize(window.document);\nmessageSender.send({ kind: \"contentSize\", size: viewportSize });\nclass MessagingGesturesListener {\n constructor(messageSender) {\n this.messageSender = messageSender;\n }\n onTap(event) {\n this.messageSender.send({ kind: \"tap\", x: event.clientX, y: event.clientY });\n }\n onLinkActivated(href) {\n this.messageSender.send({ kind: \"linkActivated\", href: href });\n }\n}\nconst messagingListener = new MessagingGesturesListener(messageSender);\nnew GesturesDetector(window, messagingListener);\nfunction parseContentSize(document) {\n const viewport = document.querySelector(\"meta[name=viewport]\");\n if (!viewport || !(viewport instanceof HTMLMetaElement)) {\n return undefined;\n }\n return parseViewportString(viewport.content);\n}\n","export class IframeMessageSender {\n constructor(messagePort) {\n this.messagePort = messagePort;\n }\n send(message) {\n this.messagePort.postMessage(message);\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\nexport function parseViewportString(viewportString) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportString))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n"],"names":["messageChannel","MessageChannel","window","parent","postMessage","port2","messageSender","constructor","messagePort","this","send","message","port1","viewportSize","document","viewport","querySelector","HTMLMetaElement","viewportString","regex","properties","Map","match","exec","set","width","parseFloat","get","height","parseViewportString","content","parseContentSize","kind","size","messagingListener","onTap","event","x","clientX","y","clientY","onLinkActivated","href","listener","addEventListener","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js index 5bef878855..123e469a47 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},this.channel=new MessageChannel,!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e,this.iframe.addEventListener("load",(()=>{this.onIframeLoaded()}),{once:!0})}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onIframeLoaded(){const t=this.iframe.contentWindow.document.querySelector("meta[name=viewport]");if(!t||t instanceof HTMLMetaElement)return;const e=this.parsePageSize(t);e&&(this.iframe.style.width=e.width+"px",this.iframe.style.height=e.height+"px",this.size=e,this.channel.port1.onmessage=t=>{this.onMessageFromIframe(t)},this.iframe.contentWindow.postMessage("Init","*",[this.channel.port2]),this.listener.onIframeLoaded())}onMessageFromIframe(t){t.data.x&&t.data.y?this.listener.onTap({x:t.data.x,y:t.data.y}):t.data.href&&this.listener.onLinkActivated(t.data.href)}parsePageSize(t){const e=/(\w+) *= *([^\s,]+)/g,i=new Map;let s;for(;s=e.exec(t.content);)null!=s&&i.set(s[1],s[2]);const n=parseFloat(i.get("width")),a=parseFloat(i.get("height"));return n&&a?{width:n,height:a}:void 0}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};a.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}}),this.metaViewport=n;const h={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};a.onTap(i)},onLinkActivated:t=>{a.onLinkActivated(t)}};this.page=new t(e,s,h)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page"),h=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,a){const h=new n(a);this.manager=new s(t,e,i,h)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,window.gestures)}(); +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e}setMessagePort(t){t.onmessage=t=>{this.onMessageFromIframe(t)}}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onMessageFromIframe(t){const e=t.data;switch(e.kind){case"contentSize":return this.onContentSizeAvailable(e.size);case"tap":return this.listener.onTap({x:e.x,y:e.y});case"linkActivated":return this.listener.onLinkActivated(e.href)}}onContentSizeAvailable(t){t&&(this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t,this.listener.onIframeLoaded())}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,e.addEventListener("message",(t=>{t.source===s.contentWindow&&t.ports[0]&&this.page.setMessagePort(t.ports[0])})),new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};a.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}}),this.metaViewport=n;const h={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};a.onTap(i)},onLinkActivated:t=>{a.onLinkActivated(t)}};this.page=new t(e,s,h)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page"),h=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,a){const h=new n(a);this.manager=new s(t,e,i,h)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,window.gestures)}(); //# sourceMappingURL=fixed-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map index f848f29406..92eafc1dc0 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n this.channel = new MessageChannel();\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n this.iframe.addEventListener(\"load\", () => {\n this.onIframeLoaded();\n }, { once: true });\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onIframeLoaded() {\n const viewport = this.iframe.contentWindow.document.querySelector(\"meta[name=viewport]\");\n if (!viewport || viewport instanceof HTMLMetaElement) {\n //FIXME: handle edge case\n return;\n }\n const pageSize = this.parsePageSize(viewport);\n if (!pageSize) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = pageSize.width + \"px\";\n this.iframe.style.height = pageSize.height + \"px\";\n this.size = pageSize;\n this.channel.port1.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n this.iframe.contentWindow.postMessage(\"Init\", \"*\", [this.channel.port2]);\n this.listener.onIframeLoaded();\n }\n onMessageFromIframe(message) {\n if (message.data.x && message.data.y) {\n this.listener.onTap({ x: message.data.x, y: message.data.y });\n }\n else if (message.data.href) {\n this.listener.onLinkActivated(message.data.href);\n }\n }\n /** Parses the page size from the viewport meta tag of the loaded resource. */\n parsePageSize(viewportMeta) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportMeta.content))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n const boundingRect = iframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","channel","MessageChannel","contentWindow","Error","addEventListener","onIframeLoaded","once","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","viewport","document","querySelector","HTMLMetaElement","pageSize","parsePageSize","port1","onmessage","message","onMessageFromIframe","postMessage","port2","data","x","y","onTap","href","onLinkActivated","viewportMeta","regex","properties","Map","match","exec","content","set","parseFloat","get","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","event","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","SingleAreaManager","metaViewport","fit","insets","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","pageListener","boundingRect","getBoundingClientRect","page","setViewport","layout","setFit","loadResource","safeDrawingSize","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n }\n setMessagePort(messagePort) {\n messagePort.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onMessageFromIframe(event) {\n const message = event.data;\n switch (message.kind) {\n case \"contentSize\":\n return this.onContentSizeAvailable(message.size);\n case \"tap\":\n return this.listener.onTap({ x: message.x, y: message.y });\n case \"linkActivated\":\n return this.listener.onLinkActivated(message.href);\n }\n }\n onContentSizeAvailable(size) {\n if (!size) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n this.listener.onIframeLoaded();\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\nexport function parseViewportString(viewportString) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportString))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n window.addEventListener(\"message\", (event) => {\n if (event.source === iframe.contentWindow && event.ports[0]) {\n this.page.setMessagePort(event.ports[0]);\n }\n });\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n const boundingRect = iframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","setMessagePort","messagePort","onmessage","message","onMessageFromIframe","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","event","data","kind","onContentSizeAvailable","onTap","x","y","onLinkActivated","href","onIframeLoaded","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","document","addEventListener","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","SingleAreaManager","metaViewport","fit","insets","source","ports","page","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","pageListener","boundingRect","getBoundingClientRect","setViewport","viewport","layout","setFit","loadResource","safeDrawingSize","content","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","querySelector","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file From 21ee4923045b3bedec02be233c7b3bfb22f3900a Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 23 Oct 2024 13:50:26 +0200 Subject: [PATCH 49/61] Introduce typed positions --- .../navigator/common/HyperlinkListener.kt | 10 +-- .../readium/navigator/common/InputListener.kt | 42 ++-------- .../navigator/common/LocatorAdapter.kt | 12 +++ .../org/readium/navigator/common/Navigator.kt | 24 +++--- .../readium/navigator/common/Overflowable.kt | 29 +++++++ .../readium/navigator/demo/DemoViewModel.kt | 2 +- .../demo/persistence/LocatorRepository.kt | 18 +++++ .../readium/navigator/demo/reader/Reader.kt | 37 +++++++-- .../navigator/demo/reader/ReaderOpener.kt | 36 ++++++--- .../org/readium/navigator/pdf/PdfLocations.kt | 42 ++++++++++ .../navigator/pdf/PdfNavigatorFactory.kt | 3 + .../navigator/pdf/PdfNavigatorLocation.kt | 11 --- .../navigator/pdf/PdfNavigatorState.kt | 24 ++++-- .../readium/navigator/pdf/PdfReadingOrder.kt | 3 + .../navigator/web/FixedWebNavigatorFactory.kt | 6 +- .../web/FixedWebNavigatorLocation.kt | 8 -- .../navigator/web/FixedWebNavigatorState.kt | 40 +++++++--- .../web/layout/FixedWebReadingOrder.kt | 3 + .../navigator/web/location/LocationTypes.kt | 69 ++++++++++++++++ .../navigator/web/location/LocatorAdapters.kt | 78 +++++++++++++++++++ 20 files changed, 389 insertions(+), 108 deletions(-) create mode 100644 readium/navigators/common/src/main/java/org/readium/navigator/common/LocatorAdapter.kt create mode 100644 readium/navigators/demo/src/main/java/org/readium/navigator/demo/persistence/LocatorRepository.kt create mode 100644 readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfLocations.kt delete mode 100644 readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorLocation.kt delete mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorLocation.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocationTypes.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocatorAdapters.kt diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt index 153b660173..939624f214 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt @@ -35,8 +35,8 @@ public data class FootnoteContext( @ExperimentalReadiumApi @Composable -public fun defaultHyperlinkListener( - navigatorState: Navigator, +public fun defaultHyperlinkListener( + navigatorState: Navigator<*, L, *>, shouldFollowReadingOrderLink: (Url, LinkContext?) -> Boolean = { _, _ -> true }, // TODO: shouldFollowResourceLink: (Url, LinkContext?) -> Boolean = { _, _ -> true }, onExternalLinkActivated: (AbsoluteUrl, LinkContext?) -> Unit = { _, _ -> } @@ -59,9 +59,9 @@ public fun defaultHyperlinkListener( } @ExperimentalReadiumApi -private class DefaultHyperlinkListener( +private class DefaultHyperlinkListener( private val coroutineScope: CoroutineScope, - private val navigatorState: Navigator, + private val navigatorState: Navigator<*, L, *>, private val navigationHistory: MutableList, private val shouldFollowReadingOrderLink: (Url, LinkContext?) -> Boolean, private val onExternalLinkActivatedDelegate: (AbsoluteUrl, LinkContext?) -> Unit @@ -70,7 +70,7 @@ private class DefaultHyperlinkListener( override fun onReadingOrderLinkActivated(url: Url, context: LinkContext?) { if (shouldFollowReadingOrderLink(url, context)) { navigationHistory.add(navigatorState.location.value) - coroutineScope.launch { navigatorState.goTo(url) } + coroutineScope.launch { navigatorState.goTo(Link(url)) } } } diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt index af70543ad6..c454aaed83 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt @@ -40,8 +40,8 @@ public data class TapContext( @ExperimentalReadiumApi @Composable -public fun defaultInputListener( - navigatorState: T, +public fun defaultInputListener( + navigatorState: Overflowable, fallbackListener: InputListener? = null, tapEdges: Set = setOf( DirectionalNavigationAdapter.TapEdge.Horizontal @@ -51,7 +51,7 @@ public fun defaultInputListener( horizontalEdgeThresholdPercent: Double? = 0.3, minimumVerticalEdgeSize: Dp = 80.0.dp, verticalEdgeThresholdPercent: Double? = 0.3 -): InputListener where T : Navigator, T : Overflowable { +): InputListener { val coroutineScope = rememberCoroutineScope() return DefaultInputListener( @@ -68,17 +68,17 @@ public fun defaultInputListener( } @OptIn(ExperimentalReadiumApi::class) -private class DefaultInputListener( +private class DefaultInputListener( private val coroutineScope: CoroutineScope, private val fallbackListener: InputListener?, - private val navigatorState: T, + private val navigatorState: Overflowable, private val tapEdges: Set, private val handleTapsWhileScrolling: Boolean, private val minimumHorizontalEdgeSize: Dp, private val horizontalEdgeThresholdPercent: Double?, private val minimumVerticalEdgeSize: Dp, private val verticalEdgeThresholdPercent: Double? -) : InputListener where T : Navigator, T : Overflowable { +) : InputListener { override fun onTap(event: TapEvent, context: TapContext) { if (!handleTap(event, context)) { @@ -101,10 +101,10 @@ private class DefaultInputListener( val rightRange = (width - horizontalEdgeSize)..width if (event.offset.x in rightRange && navigatorState.canMoveRight) { - coroutineScope.launch { navigatorState.goRight() } + coroutineScope.launch { navigatorState.moveRight() } return true } else if (event.offset.x in leftRange && navigatorState.canMoveLeft) { - coroutineScope.launch { navigatorState.goLeft() } + coroutineScope.launch { navigatorState.moveLeft() } return true } } @@ -147,30 +147,4 @@ private class DefaultInputListener( ReadingProgression.RTL -> canMoveBackward } - - /** - * Moves to the left content portion (eg. page) relative to the reading progression direction. - */ - private suspend fun Overflowable.goLeft() { - return when (overflow.value.readingProgression) { - ReadingProgression.LTR -> - moveBackward() - - ReadingProgression.RTL -> - moveForward() - } - } - - /** - * Moves to the right content portion (eg. page) relative to the reading progression direction. - */ - private suspend fun Overflowable.goRight() { - return when (overflow.value.readingProgression) { - ReadingProgression.LTR -> - moveForward() - - ReadingProgression.RTL -> - moveBackward() - } - } } diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/LocatorAdapter.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/LocatorAdapter.kt new file mode 100644 index 0000000000..7c54b921d5 --- /dev/null +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/LocatorAdapter.kt @@ -0,0 +1,12 @@ +package org.readium.navigator.common + +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.Locator + +@ExperimentalReadiumApi +public interface LocatorAdapter { + + public fun Locator.toGoLocation(): G + + public fun L.toLocator(): Locator +} diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt index 0989c1ccc8..b46730bb91 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt @@ -3,10 +3,11 @@ package org.readium.navigator.common import androidx.compose.runtime.State import org.readium.r2.shared.DelicateReadiumApi import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.Link import org.readium.r2.shared.util.Url @ExperimentalReadiumApi -public interface Navigator { +public interface Navigator { public val readingOrder: R @@ -14,27 +15,16 @@ public interface Navigator { public suspend fun goTo(location: L) - public suspend fun goTo(readingOrderItem: Int) + public suspend fun goTo(goLocation: G) - public suspend fun goTo(url: Url) { - val itemIndex = readingOrder.indexOfHref(url) ?: return - goTo(itemIndex) - } + public suspend fun goTo(link: Link) } -/** - * Data about the content to play. - */ +@ExperimentalReadiumApi public interface ReadingOrder { - /** - * List of items to play. - */ public val items: List - /** - * A piece of the content to play. - */ public interface Item { public val href: Url @@ -49,7 +39,11 @@ public interface ReadingOrder { /** * Location of the navigator. */ +@ExperimentalReadiumApi public interface Location { public val href: Url } + +@ExperimentalReadiumApi +public interface GoLocation diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/Overflowable.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/Overflowable.kt index 88d84c66ba..e1f254398f 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/Overflowable.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/Overflowable.kt @@ -1,6 +1,7 @@ package org.readium.navigator.common import androidx.compose.runtime.State +import org.readium.r2.navigator.preferences.ReadingProgression import org.readium.r2.shared.ExperimentalReadiumApi /** @@ -33,3 +34,31 @@ public interface Overflowable { @ExperimentalReadiumApi public typealias Overflow = org.readium.r2.navigator.OverflowableNavigator.Overflow + +/** + * Moves to the left content portion (eg. page) relative to the reading progression direction. + */ +@ExperimentalReadiumApi +public suspend fun Overflowable.moveLeft() { + return when (overflow.value.readingProgression) { + ReadingProgression.LTR -> + moveBackward() + + ReadingProgression.RTL -> + moveForward() + } +} + +/** + * Moves to the right content portion (eg. page) relative to the reading progression direction. + */ +@ExperimentalReadiumApi +public suspend fun Overflowable.moveRight() { + return when (overflow.value.readingProgression) { + ReadingProgression.LTR -> + moveForward() + + ReadingProgression.RTL -> + moveBackward() + } +} diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt index 14b72c3bff..30f1b9cadc 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoViewModel.kt @@ -35,7 +35,7 @@ class DemoViewModel( ) : State data class Reader( - val readerState: ReaderState<*> + val readerState: ReaderState<*, *> ) : State } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/persistence/LocatorRepository.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/persistence/LocatorRepository.kt new file mode 100644 index 0000000000..3614b37f2d --- /dev/null +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/persistence/LocatorRepository.kt @@ -0,0 +1,18 @@ +package org.readium.navigator.demo.persistence + +import org.readium.r2.shared.publication.Locator +import org.readium.r2.shared.util.AbsoluteUrl + +object LocatorRepository { + + private val savedLocators: MutableMap = + mutableMapOf() + + fun saveLocator(url: AbsoluteUrl, locator: Locator) { + savedLocators[url] = locator + } + + fun getLocator(url: AbsoluteUrl): Locator? { + return savedLocators[url] + } +} diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt index 37893e03ec..dd9f74f747 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt @@ -22,15 +22,21 @@ import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.TopAppBar import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.zIndex import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.cancel +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import org.readium.navigator.common.InputListener +import org.readium.navigator.common.Location +import org.readium.navigator.common.LocatorAdapter import org.readium.navigator.common.Navigator import org.readium.navigator.common.Overflowable import org.readium.navigator.common.ReadingOrder @@ -38,6 +44,7 @@ import org.readium.navigator.common.TapContext import org.readium.navigator.common.TapEvent import org.readium.navigator.common.defaultHyperlinkListener import org.readium.navigator.common.defaultInputListener +import org.readium.navigator.demo.persistence.LocatorRepository import org.readium.navigator.demo.preferences.UserPreferences import org.readium.navigator.demo.preferences.UserPreferencesViewModel import org.readium.navigator.demo.util.launchWebBrowser @@ -47,13 +54,16 @@ import org.readium.navigator.web.FixedWebNavigator import org.readium.navigator.web.FixedWebNavigatorState import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.Publication +import org.readium.r2.shared.util.AbsoluteUrl import org.readium.r2.shared.util.toUri -data class ReaderState( +data class ReaderState( + val url: AbsoluteUrl, val coroutineScope: CoroutineScope, val publication: Publication, - val navigatorState: Navigator, - val preferencesViewModel: UserPreferencesViewModel<*, *> + val navigatorState: Navigator, + val preferencesViewModel: UserPreferencesViewModel<*, *>, + val locatorAdapter: LocatorAdapter ) { fun close() { @@ -62,10 +72,10 @@ data class ReaderState( } } -@OptIn(ExperimentalMaterial3Api::class, ExperimentalReadiumApi::class) +@OptIn(ExperimentalMaterial3Api::class) @Composable -fun Reader( - state: ReaderState, +fun Reader( + state: ReaderState, fullScreenState: MutableState ) { val showPreferences = remember { mutableStateOf(false) } @@ -116,6 +126,21 @@ fun Reader( onExternalLinkActivated = { url, _ -> launchWebBrowser(context, url.toUri()) } ) + val locationFlow = remember { + snapshotFlow { + state.navigatorState.location.value + } + } + + LaunchedEffect(locationFlow) { + locationFlow + .onEach { + val locator = with(state.locatorAdapter) { it.toLocator() } + LocatorRepository.saveLocator(state.url, locator) + } + .launchIn(state.coroutineScope) + } + when (state.navigatorState) { is FixedWebNavigatorState -> { FixedWebNavigator( diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt index f520bf2cd0..a1546164ac 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt @@ -16,6 +16,7 @@ import org.readium.adapter.pdfium.document.PdfiumDocumentFactory import org.readium.adapter.pdfium.navigator.PdfiumEngineProvider import org.readium.adapter.pdfium.navigator.PdfiumPreferences import org.readium.adapter.pdfium.navigator.PdfiumSettings +import org.readium.navigator.demo.persistence.LocatorRepository import org.readium.navigator.demo.preferences.PreferencesManager import org.readium.navigator.demo.preferences.UserPreferencesViewModel import org.readium.navigator.pdf.PdfNavigatorFactory @@ -23,6 +24,7 @@ import org.readium.navigator.web.FixedWebNavigatorFactory import org.readium.navigator.web.preferences.FixedWebPreferences import org.readium.navigator.web.preferences.FixedWebSettings import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.Locator import org.readium.r2.shared.publication.Publication import org.readium.r2.shared.util.AbsoluteUrl import org.readium.r2.shared.util.DebugError @@ -56,7 +58,7 @@ class ReaderOpener( private val pdfEngineProvider = PdfiumEngineProvider() - suspend fun open(url: AbsoluteUrl): Try, Error> { + suspend fun open(url: AbsoluteUrl): Try, Error> { val asset = assetRetriever.retrieve(url) .getOrElse { return Try.failure(it) } @@ -66,11 +68,13 @@ class ReaderOpener( return Try.failure(it) } + val initialLocator = LocatorRepository.getLocator(url) + val readerState = when { publication.conformsTo(Publication.Profile.EPUB) -> - createFixedWebReader(publication) + createFixedWebReader(url, publication, initialLocator) publication.conformsTo(Publication.Profile.PDF) -> - createPdfReader(publication) + createPdfReader(url, publication, initialLocator) else -> Try.failure(DebugError("Publication not supported")) }.getOrElse { error -> @@ -82,14 +86,17 @@ class ReaderOpener( } private suspend fun createFixedWebReader( - publication: Publication - ): Try, Error> { + url: AbsoluteUrl, + publication: Publication, + initialLocator: Locator? + ): Try, Error> { val navigatorFactory = FixedWebNavigatorFactory(application, publication) ?: return Try.failure(DebugError("Publication not supported")) val initialPreferences = FixedWebPreferences() val navigatorState = navigatorFactory.createNavigator( + initialLocator = initialLocator, initialPreferences = initialPreferences ).getOrElse { return Try.failure(it) @@ -109,24 +116,31 @@ class ReaderOpener( navigatorState.preferences.value = it }.launchIn(coroutineScope) + val locatorAdapter = navigatorFactory.createLocatorAdapter() + val readerState = ReaderState( + url = url, coroutineScope = coroutineScope, publication = publication, navigatorState = navigatorState, - preferencesViewModel = preferencesViewModel + preferencesViewModel = preferencesViewModel, + locatorAdapter = locatorAdapter ) return Try.success(readerState) } private fun createPdfReader( - publication: Publication - ): Try, Error> { + url: AbsoluteUrl, + publication: Publication, + initialLocator: Locator? + ): Try, Error> { val navigatorFactory = PdfNavigatorFactory(publication, pdfEngineProvider) val initialPreferences = PdfiumPreferences() val navigatorState = navigatorFactory.createNavigator( + initialLocator = initialLocator, initialPreferences = initialPreferences ).getOrElse { throw IllegalStateException() @@ -145,11 +159,15 @@ class ReaderOpener( .onEach { navigatorState.preferences.value = it } .launchIn(coroutineScope) + val locatorAdapter = navigatorFactory.createLocatorAdapter() + val readerState = ReaderState( + url = url, coroutineScope = coroutineScope, publication = publication, navigatorState = navigatorState, - preferencesViewModel = preferencesViewModel + preferencesViewModel = preferencesViewModel, + locatorAdapter = locatorAdapter ) return Try.success(readerState) diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfLocations.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfLocations.kt new file mode 100644 index 0000000000..6ae89f486e --- /dev/null +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfLocations.kt @@ -0,0 +1,42 @@ +package org.readium.navigator.pdf + +import org.readium.navigator.common.GoLocation +import org.readium.navigator.common.Location +import org.readium.navigator.common.LocatorAdapter +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.Link +import org.readium.r2.shared.publication.Locator +import org.readium.r2.shared.publication.Publication +import org.readium.r2.shared.util.Url + +@ExperimentalReadiumApi +public sealed interface PdfGoLocation : GoLocation + +@ExperimentalReadiumApi +public data class PageLocation( + override val href: Url, + val page: Int +) : Location, PdfGoLocation + +@ExperimentalReadiumApi +public data class PositionLocation( + val position: Int +) : PdfGoLocation + +@ExperimentalReadiumApi +public data class PdfLocation( + override val href: Url, + val page: Int +) : Location + +@ExperimentalReadiumApi +public class PdfLocatorAdapter( + private val publication: Publication +) : LocatorAdapter { + override fun Locator.toGoLocation(): PdfGoLocation = + PositionLocation(position = locations.position!!) + + override fun PdfLocation.toLocator(): Locator = + publication.locatorFromLink(Link(href))!! + .copyWithLocations(position = page) +} diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt index d4e4234cc0..e9c11aa38d 100644 --- a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt @@ -60,4 +60,7 @@ public class PdfNavigatorFactory, E : Preferenc currentPreferences: P ): E = pdfEngineProvider.createPreferenceEditor(publication, currentPreferences) + + public fun createLocatorAdapter(): PdfLocatorAdapter = + PdfLocatorAdapter(publication) } diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorLocation.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorLocation.kt deleted file mode 100644 index dbe39684f0..0000000000 --- a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorLocation.kt +++ /dev/null @@ -1,11 +0,0 @@ -package org.readium.navigator.pdf - -import org.readium.navigator.common.Location -import org.readium.r2.shared.publication.Locator -import org.readium.r2.shared.util.Url - -public data class PdfNavigatorLocation( - val locator: Locator -) : Location { - override val href: Url = locator.href -} diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt index bcb17719f1..d62437cf99 100644 --- a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt @@ -11,6 +11,7 @@ import org.readium.navigator.common.Preferences import org.readium.navigator.common.Settings import org.readium.r2.navigator.pdf.PdfNavigatorFactory import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.Link import org.readium.r2.shared.publication.Locator @ExperimentalReadiumApi @@ -21,7 +22,7 @@ public class PdfNavigatorState> internal constr private val settingsResolver: (P) -> S, initialLocator: Locator, initialPreferences: P -) : Navigator, Configurable { +) : Navigator, Configurable { override val preferences: MutableState

      = mutableStateOf(initialPreferences) @@ -35,14 +36,23 @@ public class PdfNavigatorState> internal constr internal val pendingLocator: MutableState = mutableStateOf(null) - override val location: State = - derivedStateOf { PdfNavigatorLocation(locator.value) } + override val location: State = + derivedStateOf { + PdfLocation(href = locator.value.href, page = locator.value.locations.position!!) + } - override suspend fun goTo(location: PdfNavigatorLocation) { - pendingLocator.value = locator.value + override suspend fun goTo(link: Link) { + goTo(PageLocation(link.url(), 0)) } - override suspend fun goTo(readingOrderItem: Int) { - pendingLocator.value = locator.value.copy(locations = Locator.Locations(position = 0)) + override suspend fun goTo(location: PdfLocation) { + pendingLocator.value = locator.value.copyWithLocations(position = location.page) + } + + override suspend fun goTo(goLocation: PdfGoLocation) { + pendingLocator.value = when (goLocation) { + is PositionLocation -> locator.value.copyWithLocations(position = goLocation.position) + is PageLocation -> locator.value.copyWithLocations(position = goLocation.page) + } } } diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfReadingOrder.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfReadingOrder.kt index 4049227cdb..c3cd681071 100644 --- a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfReadingOrder.kt +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfReadingOrder.kt @@ -1,12 +1,15 @@ package org.readium.navigator.pdf import org.readium.navigator.common.ReadingOrder +import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.Url +@ExperimentalReadiumApi public data class PdfReadingOrder( override val items: List ) : ReadingOrder +@ExperimentalReadiumApi public data class PdfReadingOrderItem( override val href: Url ) : ReadingOrder.Item diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt index 775aed1b00..6981259ac9 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt @@ -10,6 +10,7 @@ import android.app.Application import java.io.IOException import org.readium.navigator.web.layout.FixedWebReadingOrder import org.readium.navigator.web.layout.FixedWebReadingOrderItem +import org.readium.navigator.web.location.FixedWebLocatorAdapter import org.readium.navigator.web.preferences.FixedWebDefaults import org.readium.navigator.web.preferences.FixedWebPreferences import org.readium.navigator.web.preferences.FixedWebPreferencesEditor @@ -107,7 +108,7 @@ public class FixedWebNavigatorFactory private constructor( readingOrder = FixedWebReadingOrder(items), initialPreferences = initialPreferences ?: FixedWebPreferences(), defaults = defaults, - initialItem = initialIndex, + initialLocation = initialIndex, webViewServer = webViewServer, preloadedData = preloads ) @@ -147,4 +148,7 @@ public class FixedWebNavigatorFactory private constructor( publication.metadata, defaults ) + + public fun createLocatorAdapter(): FixedWebLocatorAdapter = + FixedWebLocatorAdapter(publication) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorLocation.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorLocation.kt deleted file mode 100644 index 7db235ba05..0000000000 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorLocation.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.readium.navigator.web - -import org.readium.navigator.common.Location -import org.readium.r2.shared.util.Url - -public data class FixedWebNavigatorLocation( - override val href: Url -) : Location diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt index d3d8d4ee96..03328e1843 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt @@ -15,6 +15,9 @@ import org.readium.navigator.common.Overflowable import org.readium.navigator.web.layout.FixedWebReadingOrder import org.readium.navigator.web.layout.Layout import org.readium.navigator.web.layout.LayoutResolver +import org.readium.navigator.web.location.FixedWebGoLocation +import org.readium.navigator.web.location.FixedWebLocation +import org.readium.navigator.web.location.HrefLocation import org.readium.navigator.web.preferences.FixedWebDefaults import org.readium.navigator.web.preferences.FixedWebPreferences import org.readium.navigator.web.preferences.FixedWebSettings @@ -26,6 +29,7 @@ import org.readium.r2.navigator.preferences.Axis import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.InternalReadiumApi +import org.readium.r2.shared.publication.Link import org.readium.r2.shared.publication.Metadata @ExperimentalReadiumApi @@ -35,13 +39,13 @@ public class FixedWebNavigatorState internal constructor( override val readingOrder: FixedWebReadingOrder, initialPreferences: FixedWebPreferences, defaults: FixedWebDefaults, - initialItem: Int, + initialLocation: Int, internal val webViewServer: WebViewServer, internal val preloadedData: PreloadedData -) : Navigator, Configurable, Overflowable { +) : Navigator, Configurable, Overflowable { init { - require(initialItem < readingOrder.items.size) + require(initialLocation < readingOrder.items.size) } internal data class PreloadedData( @@ -74,20 +78,34 @@ public class FixedWebNavigatorState internal constructor( derivedStateOf { settings.value.fit } internal val pagerState: PagerState = - PagerState(currentPage = layout.value.spreadIndexForPage(initialItem)) { layout.value.spreads.size } + PagerState(currentPage = layout.value.spreadIndexForPage(initialLocation)) { layout.value.spreads.size } - public val currentItem: State = + private val currentItem: State = derivedStateOf { layout.value.pageIndexForSpread(pagerState.currentPage) } - override val location: State = - derivedStateOf { FixedWebNavigatorLocation(readingOrder.items[currentItem.value].href) } + override val location: State = + derivedStateOf { FixedWebLocation(readingOrder.items[currentItem.value].href) } - override suspend fun goTo(location: FixedWebNavigatorLocation) { - val pageIndex = checkNotNull(readingOrder.indexOfHref(location.href)) - pagerState.scrollToPage(layout.value.spreadIndexForPage(pageIndex)) + override suspend fun goTo(link: Link) { + val href = link.url().removeFragment() + val location = HrefLocation(href) + goTo(location) } - public override suspend fun goTo(readingOrderItem: Int) { + override suspend fun goTo(goLocation: FixedWebGoLocation) { + when (goLocation) { + is HrefLocation -> { + val pageIndex = checkNotNull(readingOrder.indexOfHref(goLocation.href)) + pagerState.scrollToPage(layout.value.spreadIndexForPage(pageIndex)) + } + } + } + + override suspend fun goTo(location: FixedWebLocation) { + return goTo(HrefLocation(location.href)) + } + + public suspend fun goTo(readingOrderItem: Int) { pagerState.scrollToPage(layout.value.spreadIndexForPage(readingOrderItem)) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/FixedWebReadingOrder.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/FixedWebReadingOrder.kt index 641d3e3f4d..584ed9a30c 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/FixedWebReadingOrder.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/FixedWebReadingOrder.kt @@ -1,13 +1,16 @@ package org.readium.navigator.web.layout import org.readium.navigator.common.ReadingOrder +import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.presentation.Presentation import org.readium.r2.shared.util.Url +@ExperimentalReadiumApi public data class FixedWebReadingOrder( override val items: List ) : ReadingOrder +@ExperimentalReadiumApi public data class FixedWebReadingOrderItem( override val href: Url, val page: Presentation.Page? diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocationTypes.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocationTypes.kt new file mode 100644 index 0000000000..f0472273df --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocationTypes.kt @@ -0,0 +1,69 @@ +package org.readium.navigator.web.location + +import org.readium.navigator.common.GoLocation +import org.readium.navigator.common.Location +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.util.Url + +@ExperimentalReadiumApi +@JvmInline +public value class CssSelector( + public val value: String +) + +@ExperimentalReadiumApi +@JvmInline +public value class Progression( + public val value: Double +) + +@ExperimentalReadiumApi +@JvmInline +public value class TextFragment( + public val value: String +) + +@ExperimentalReadiumApi +public sealed interface FixedWebGoLocation : GoLocation + +@ExperimentalReadiumApi +public sealed interface ReflowableWebGoLocation : GoLocation + +@ExperimentalReadiumApi +public data class ProgressionLocation( + val href: Url, + val progression: Double +) : ReflowableWebGoLocation + +@ExperimentalReadiumApi +public data class TextLocation( + val href: Url, + val cssSelector: String?, + val textBefore: String?, + val textAfter: String? +) : ReflowableWebGoLocation + +@ExperimentalReadiumApi +public data class PositionLocation( + val position: Int +) : ReflowableWebGoLocation + +@ExperimentalReadiumApi +public data class HrefLocation( + val href: Url +) : ReflowableWebGoLocation, FixedWebGoLocation + +@ExperimentalReadiumApi +public data class ReflowableWebLocation( + override val href: Url, + val progression: Double, + val cssSelector: String?, + val textBefore: String?, + val textAfter: String?, + val position: Int? +) : Location + +@ExperimentalReadiumApi +public data class FixedWebLocation( + override val href: Url +) : Location diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocatorAdapters.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocatorAdapters.kt new file mode 100644 index 0000000000..8a2447e9d8 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocatorAdapters.kt @@ -0,0 +1,78 @@ +package org.readium.navigator.web.location + +import org.readium.navigator.common.LocatorAdapter +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.Link +import org.readium.r2.shared.publication.Locator +import org.readium.r2.shared.publication.Publication +import org.readium.r2.shared.publication.html.cssSelector +import org.readium.r2.shared.publication.indexOfFirstWithHref + +@ExperimentalReadiumApi +public class FixedWebLocatorAdapter( + private val publication: Publication +) : LocatorAdapter { + public fun FixedWebGoLocation.toLocator(): Locator = + when (this) { + is HrefLocation -> publication.locatorFromLink(Link(href))!! + } + + public override fun Locator.toGoLocation(): FixedWebGoLocation = + HrefLocation(href) + + override fun FixedWebLocation.toLocator(): Locator { + val position = publication.readingOrder.indexOfFirstWithHref(href) + return publication.locatorFromLink(Link(href))!! + .copyWithLocations(position = position) + } +} + +@ExperimentalReadiumApi +public class ReflowableWebLocatorAdapter( + private val publication: Publication, + private val allowProduceHrefLocation: Boolean = false +) : LocatorAdapter { + public override fun ReflowableWebLocation.toLocator(): Locator = + publication.locatorFromLink(Link(href))!! + .copy( + text = Locator.Text( + after = textAfter, + before = textBefore + ) + ) + .copyWithLocations( + progression = progression, + position = position, + otherLocations = buildMap { cssSelector?.let { put("cssSelector", cssSelector) } } + ) + + public override fun Locator.toGoLocation(): ReflowableWebGoLocation { + return when { + text.highlight != null || text.before != null || text.after != null -> { + TextLocation( + href = href, + textBefore = text.before, + textAfter = text.highlight?.let { it + text.after } ?: text.after, + cssSelector = locations.cssSelector + ) + } + locations.progression != null -> { + ProgressionLocation( + href = href, + progression = locations.progression!! + ) + } + locations.position != null -> { + PositionLocation( + position = locations.position!! + ) + } + else -> + if (allowProduceHrefLocation) { + HrefLocation(href = href) + } else { + throw IllegalArgumentException("No supported location found in locator.") + } + } + } +} From 4584e4f835d3e9704189252d8a39f5e5ce2ccba1 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Wed, 23 Oct 2024 16:44:25 +0200 Subject: [PATCH 50/61] Renaming --- .../org/readium/navigator/common/LocatorAdapter.kt | 2 +- .../java/org/readium/navigator/common/Navigator.kt | 6 +++--- .../java/org/readium/navigator/pdf/PdfLocations.kt | 4 ++-- .../org/readium/navigator/pdf/PdfNavigatorState.kt | 10 ++++++---- .../navigator/web/FixedWebNavigatorState.kt | 13 ++++++++----- .../navigator/web/location/LocationTypes.kt | 14 +++++++------- .../navigator/web/location/LocatorAdapters.kt | 10 +++++----- 7 files changed, 32 insertions(+), 27 deletions(-) diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/LocatorAdapter.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/LocatorAdapter.kt index 7c54b921d5..6d7ac6e134 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/LocatorAdapter.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/LocatorAdapter.kt @@ -4,7 +4,7 @@ import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.Locator @ExperimentalReadiumApi -public interface LocatorAdapter { +public interface LocatorAdapter { public fun Locator.toGoLocation(): G diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt index b46730bb91..05f80c67cc 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt @@ -7,7 +7,7 @@ import org.readium.r2.shared.publication.Link import org.readium.r2.shared.util.Url @ExperimentalReadiumApi -public interface Navigator { +public interface Navigator { public val readingOrder: R @@ -15,7 +15,7 @@ public interface Navigator { public suspend fun goTo(location: L) - public suspend fun goTo(goLocation: G) + public suspend fun goTo(targetLocation: G) public suspend fun goTo(link: Link) } @@ -46,4 +46,4 @@ public interface Location { } @ExperimentalReadiumApi -public interface GoLocation +public interface TargetLocation diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfLocations.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfLocations.kt index 6ae89f486e..7e48191ece 100644 --- a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfLocations.kt +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfLocations.kt @@ -1,8 +1,8 @@ package org.readium.navigator.pdf -import org.readium.navigator.common.GoLocation import org.readium.navigator.common.Location import org.readium.navigator.common.LocatorAdapter +import org.readium.navigator.common.TargetLocation import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.Link import org.readium.r2.shared.publication.Locator @@ -10,7 +10,7 @@ import org.readium.r2.shared.publication.Publication import org.readium.r2.shared.util.Url @ExperimentalReadiumApi -public sealed interface PdfGoLocation : GoLocation +public sealed interface PdfGoLocation : TargetLocation @ExperimentalReadiumApi public data class PageLocation( diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt index d62437cf99..18cff948f8 100644 --- a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt @@ -49,10 +49,12 @@ public class PdfNavigatorState> internal constr pendingLocator.value = locator.value.copyWithLocations(position = location.page) } - override suspend fun goTo(goLocation: PdfGoLocation) { - pendingLocator.value = when (goLocation) { - is PositionLocation -> locator.value.copyWithLocations(position = goLocation.position) - is PageLocation -> locator.value.copyWithLocations(position = goLocation.page) + override suspend fun goTo(targetLocation: PdfGoLocation) { + pendingLocator.value = when (targetLocation) { + is PositionLocation -> locator.value.copyWithLocations( + position = targetLocation.position + ) + is PageLocation -> locator.value.copyWithLocations(position = targetLocation.page) } } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt index 03328e1843..05f4faa8ec 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt @@ -15,8 +15,8 @@ import org.readium.navigator.common.Overflowable import org.readium.navigator.web.layout.FixedWebReadingOrder import org.readium.navigator.web.layout.Layout import org.readium.navigator.web.layout.LayoutResolver -import org.readium.navigator.web.location.FixedWebGoLocation import org.readium.navigator.web.location.FixedWebLocation +import org.readium.navigator.web.location.FixedWebTargetLocation import org.readium.navigator.web.location.HrefLocation import org.readium.navigator.web.preferences.FixedWebDefaults import org.readium.navigator.web.preferences.FixedWebPreferences @@ -42,7 +42,7 @@ public class FixedWebNavigatorState internal constructor( initialLocation: Int, internal val webViewServer: WebViewServer, internal val preloadedData: PreloadedData -) : Navigator, Configurable, Overflowable { +) : Navigator, Configurable, Overflowable { init { require(initialLocation < readingOrder.items.size) @@ -86,16 +86,19 @@ public class FixedWebNavigatorState internal constructor( override val location: State = derivedStateOf { FixedWebLocation(readingOrder.items[currentItem.value].href) } + internal fun updateLocation(location: FixedWebLocation) { + } + override suspend fun goTo(link: Link) { val href = link.url().removeFragment() val location = HrefLocation(href) goTo(location) } - override suspend fun goTo(goLocation: FixedWebGoLocation) { - when (goLocation) { + override suspend fun goTo(targetLocation: FixedWebTargetLocation) { + when (targetLocation) { is HrefLocation -> { - val pageIndex = checkNotNull(readingOrder.indexOfHref(goLocation.href)) + val pageIndex = checkNotNull(readingOrder.indexOfHref(targetLocation.href)) pagerState.scrollToPage(layout.value.spreadIndexForPage(pageIndex)) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocationTypes.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocationTypes.kt index f0472273df..41af349312 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocationTypes.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocationTypes.kt @@ -1,7 +1,7 @@ package org.readium.navigator.web.location -import org.readium.navigator.common.GoLocation import org.readium.navigator.common.Location +import org.readium.navigator.common.TargetLocation import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.Url @@ -24,16 +24,16 @@ public value class TextFragment( ) @ExperimentalReadiumApi -public sealed interface FixedWebGoLocation : GoLocation +public sealed interface FixedWebTargetLocation : TargetLocation @ExperimentalReadiumApi -public sealed interface ReflowableWebGoLocation : GoLocation +public sealed interface ReflowableWebTargetLocation : TargetLocation @ExperimentalReadiumApi public data class ProgressionLocation( val href: Url, val progression: Double -) : ReflowableWebGoLocation +) : ReflowableWebTargetLocation @ExperimentalReadiumApi public data class TextLocation( @@ -41,17 +41,17 @@ public data class TextLocation( val cssSelector: String?, val textBefore: String?, val textAfter: String? -) : ReflowableWebGoLocation +) : ReflowableWebTargetLocation @ExperimentalReadiumApi public data class PositionLocation( val position: Int -) : ReflowableWebGoLocation +) : ReflowableWebTargetLocation @ExperimentalReadiumApi public data class HrefLocation( val href: Url -) : ReflowableWebGoLocation, FixedWebGoLocation +) : ReflowableWebTargetLocation, FixedWebTargetLocation @ExperimentalReadiumApi public data class ReflowableWebLocation( diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocatorAdapters.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocatorAdapters.kt index 8a2447e9d8..96dc01fd91 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocatorAdapters.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocatorAdapters.kt @@ -11,13 +11,13 @@ import org.readium.r2.shared.publication.indexOfFirstWithHref @ExperimentalReadiumApi public class FixedWebLocatorAdapter( private val publication: Publication -) : LocatorAdapter { - public fun FixedWebGoLocation.toLocator(): Locator = +) : LocatorAdapter { + public fun FixedWebTargetLocation.toLocator(): Locator = when (this) { is HrefLocation -> publication.locatorFromLink(Link(href))!! } - public override fun Locator.toGoLocation(): FixedWebGoLocation = + public override fun Locator.toGoLocation(): FixedWebTargetLocation = HrefLocation(href) override fun FixedWebLocation.toLocator(): Locator { @@ -31,7 +31,7 @@ public class FixedWebLocatorAdapter( public class ReflowableWebLocatorAdapter( private val publication: Publication, private val allowProduceHrefLocation: Boolean = false -) : LocatorAdapter { +) : LocatorAdapter { public override fun ReflowableWebLocation.toLocator(): Locator = publication.locatorFromLink(Link(href))!! .copy( @@ -46,7 +46,7 @@ public class ReflowableWebLocatorAdapter( otherLocations = buildMap { cssSelector?.let { put("cssSelector", cssSelector) } } ) - public override fun Locator.toGoLocation(): ReflowableWebGoLocation { + public override fun Locator.toGoLocation(): ReflowableWebTargetLocation { return when { text.highlight != null || text.before != null || text.after != null -> { TextLocation( From 35468567a48c3e8c31065c56ca990f0f034dac29 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Thu, 24 Oct 2024 11:15:13 +0200 Subject: [PATCH 51/61] Allow state to depend on composition and fix navigation history --- .../navigator/common/HyperlinkListener.kt | 31 ++- .../readium/navigator/common/InputListener.kt | 7 + .../navigator/common/LocatorAdapter.kt | 2 +- .../org/readium/navigator/common/Navigator.kt | 4 +- .../navigator/common/NavigatorState.kt | 25 ++ .../readium/navigator/demo/DemoActivity.kt | 2 +- .../readium/navigator/demo/reader/Reader.kt | 83 ++++--- .../navigator/demo/reader/ReaderOpener.kt | 18 +- .../org/readium/navigator/pdf/PdfLocations.kt | 4 +- .../navigator/web/FixedWebNavigator.kt | 22 +- .../navigator/web/FixedWebNavigatorFactory.kt | 14 +- .../navigator/web/FixedWebNavigatorState.kt | 152 ------------ .../readium/navigator/web/FixedWebState.kt | 227 ++++++++++++++++++ .../navigator/web/location/LocationTypes.kt | 14 +- .../navigator/web/location/LocatorAdapters.kt | 10 +- 15 files changed, 382 insertions(+), 233 deletions(-) create mode 100644 readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt delete mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebState.kt diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt index 939624f214..11697c5949 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt @@ -2,6 +2,8 @@ package org.readium.navigator.common import androidx.activity.compose.BackHandler import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import kotlinx.coroutines.CoroutineScope @@ -33,6 +35,18 @@ public data class FootnoteContext( public val noteContent: String ) : LinkContext +@ExperimentalReadiumApi +public object NullHyperlinkListener : HyperlinkListener { + override fun onReadingOrderLinkActivated(url: Url, context: LinkContext?) { + } + + override fun onResourceLinkActivated(url: Url, context: LinkContext?) { + } + + override fun onExternalLinkActivated(url: AbsoluteUrl, context: LinkContext?) { + } +} + @ExperimentalReadiumApi @Composable public fun defaultHyperlinkListener( @@ -42,18 +56,23 @@ public fun defaultHyperlinkListener( onExternalLinkActivated: (AbsoluteUrl, LinkContext?) -> Unit = { _, _ -> } ): HyperlinkListener { val coroutineScope = rememberCoroutineScope() - val navigationHistory: MutableList = remember { mutableListOf() } + val navigationHistory: MutableState> = remember { mutableStateOf(emptyList()) } - BackHandler(enabled = navigationHistory.isNotEmpty()) { - val previousItem = navigationHistory.removeLast() + BackHandler(enabled = navigationHistory.value.isNotEmpty()) { + val previousItem = navigationHistory.value.last() + navigationHistory.value -= previousItem coroutineScope.launch { navigatorState.goTo(previousItem) } } + val onPreFollowingReadingOrder = { + navigationHistory.value += navigatorState.location.value + } + return DefaultHyperlinkListener( coroutineScope = coroutineScope, navigatorState = navigatorState, - navigationHistory = navigationHistory, shouldFollowReadingOrderLink = shouldFollowReadingOrderLink, + onPreFollowingReadingOrderLink = onPreFollowingReadingOrder, onExternalLinkActivatedDelegate = onExternalLinkActivated ) } @@ -62,14 +81,14 @@ public fun defaultHyperlinkListener( private class DefaultHyperlinkListener( private val coroutineScope: CoroutineScope, private val navigatorState: Navigator<*, L, *>, - private val navigationHistory: MutableList, private val shouldFollowReadingOrderLink: (Url, LinkContext?) -> Boolean, + private val onPreFollowingReadingOrderLink: () -> Unit, private val onExternalLinkActivatedDelegate: (AbsoluteUrl, LinkContext?) -> Unit ) : HyperlinkListener { override fun onReadingOrderLinkActivated(url: Url, context: LinkContext?) { if (shouldFollowReadingOrderLink(url, context)) { - navigationHistory.add(navigatorState.location.value) + onPreFollowingReadingOrderLink() coroutineScope.launch { navigatorState.goTo(Link(url)) } } } diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt index c454aaed83..a37d7ba8e2 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt @@ -38,6 +38,13 @@ public data class TapContext( val viewport: DpSize ) +@ExperimentalReadiumApi +public object NullInputListener : InputListener { + override fun onTap(event: TapEvent, context: TapContext) { + // Do nothing + } +} + @ExperimentalReadiumApi @Composable public fun defaultInputListener( diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/LocatorAdapter.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/LocatorAdapter.kt index 6d7ac6e134..7c54b921d5 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/LocatorAdapter.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/LocatorAdapter.kt @@ -4,7 +4,7 @@ import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.Locator @ExperimentalReadiumApi -public interface LocatorAdapter { +public interface LocatorAdapter { public fun Locator.toGoLocation(): G diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt index 05f80c67cc..ec36062d46 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt @@ -7,7 +7,7 @@ import org.readium.r2.shared.publication.Link import org.readium.r2.shared.util.Url @ExperimentalReadiumApi -public interface Navigator { +public interface Navigator { public val readingOrder: R @@ -46,4 +46,4 @@ public interface Location { } @ExperimentalReadiumApi -public interface TargetLocation +public interface GoLocation diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt new file mode 100644 index 0000000000..7787e9f1ea --- /dev/null +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt @@ -0,0 +1,25 @@ +package org.readium.navigator.common + +import androidx.compose.runtime.State +import org.readium.r2.shared.ExperimentalReadiumApi + +@ExperimentalReadiumApi +public interface NavigatorState> { + + public val state: State> +} + +@ExperimentalReadiumApi +public sealed interface NavigatorInitializationState { + + public val navigator: N? + + public class Pending : NavigatorInitializationState { + + override val navigator: Nothing? = null + } + + public data class Initialized( + override val navigator: N + ) : NavigatorInitializationState +} diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt index 276f5c5c89..9d9abf3248 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt @@ -102,7 +102,7 @@ class DemoActivity : FragmentActivity() { } Reader( - state = stateNow.readerState, + readerState = stateNow.readerState, fullScreenState = fullscreenState ) } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt index dd9f74f747..e6a1d6ba53 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt @@ -38,8 +38,10 @@ import org.readium.navigator.common.InputListener import org.readium.navigator.common.Location import org.readium.navigator.common.LocatorAdapter import org.readium.navigator.common.Navigator +import org.readium.navigator.common.NavigatorInitializationState +import org.readium.navigator.common.NavigatorState +import org.readium.navigator.common.NullHyperlinkListener import org.readium.navigator.common.Overflowable -import org.readium.navigator.common.ReadingOrder import org.readium.navigator.common.TapContext import org.readium.navigator.common.TapEvent import org.readium.navigator.common.defaultHyperlinkListener @@ -48,20 +50,18 @@ import org.readium.navigator.demo.persistence.LocatorRepository import org.readium.navigator.demo.preferences.UserPreferences import org.readium.navigator.demo.preferences.UserPreferencesViewModel import org.readium.navigator.demo.util.launchWebBrowser -import org.readium.navigator.pdf.PdfNavigator -import org.readium.navigator.pdf.PdfNavigatorState import org.readium.navigator.web.FixedWebNavigator -import org.readium.navigator.web.FixedWebNavigatorState +import org.readium.navigator.web.FixedWebState import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.Publication import org.readium.r2.shared.util.AbsoluteUrl import org.readium.r2.shared.util.toUri -data class ReaderState( +data class ReaderState>( val url: AbsoluteUrl, val coroutineScope: CoroutineScope, val publication: Publication, - val navigatorState: Navigator, + val navigatorState: NavigatorState, val preferencesViewModel: UserPreferencesViewModel<*, *>, val locatorAdapter: LocatorAdapter ) { @@ -74,8 +74,8 @@ data class ReaderState( @OptIn(ExperimentalMaterial3Api::class) @Composable -fun Reader( - state: ReaderState, +fun > Reader( + readerState: ReaderState, fullScreenState: MutableState ) { val showPreferences = remember { mutableStateOf(false) } @@ -87,7 +87,7 @@ fun Reader( onDismissRequest = { showPreferences.value = false } ) { UserPreferences( - model = state.preferencesViewModel, + model = readerState.preferencesViewModel, title = "Preferences" ) } @@ -109,54 +109,59 @@ fun Reader( } val inputListener = - if (state.navigatorState is Overflowable) { - defaultInputListener( - navigatorState = state.navigatorState, - fallbackListener = fallbackInputListener - ) - } else { - fallbackInputListener + when (val stateNow = readerState.navigatorState.state.value) { + is NavigatorInitializationState.Pending -> fallbackInputListener + is NavigatorInitializationState.Initialized -> { + (stateNow.navigator as? Overflowable)?.let { + defaultInputListener( + navigatorState = it, + fallbackListener = fallbackInputListener + ) + } ?: fallbackInputListener + } } - val context = LocalContext.current - val hyperlinkListener = - defaultHyperlinkListener( - navigatorState = state.navigatorState, - onExternalLinkActivated = { url, _ -> launchWebBrowser(context, url.toUri()) } - ) - - val locationFlow = remember { - snapshotFlow { - state.navigatorState.location.value + when (val stateNow = readerState.navigatorState.state.value) { + is NavigatorInitializationState.Pending -> NullHyperlinkListener + is NavigatorInitializationState.Initialized -> { + val context = LocalContext.current + defaultHyperlinkListener( + navigatorState = stateNow.navigator, + onExternalLinkActivated = { url, _ -> launchWebBrowser(context, url.toUri()) } + ) + } } - } - LaunchedEffect(locationFlow) { - locationFlow - .onEach { - val locator = with(state.locatorAdapter) { it.toLocator() } - LocatorRepository.saveLocator(state.url, locator) - } - .launchIn(state.coroutineScope) + val navigatorNow = readerState.navigatorState.state.value.navigator + + LaunchedEffect(readerState.navigatorState) { + navigatorNow ?: return@LaunchedEffect + + snapshotFlow { + navigatorNow.location.value + }.onEach { + val locator = with(readerState.locatorAdapter) { it.toLocator() } + LocatorRepository.saveLocator(readerState.url, locator) + }.launchIn(readerState.coroutineScope) } - when (state.navigatorState) { - is FixedWebNavigatorState -> { + when (readerState.navigatorState) { + is FixedWebState -> { FixedWebNavigator( modifier = Modifier.fillMaxSize(), - state = state.navigatorState, + state = readerState.navigatorState, inputListener = inputListener, hyperlinkListener = hyperlinkListener ) } - is PdfNavigatorState<*, *> -> { + /*is PdfNavigatorState<*, *> -> { PdfNavigator( modifier = Modifier.fillMaxSize(), state = state.navigatorState, inputListener = inputListener ) - } + }*/ } } } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt index a1546164ac..4db2904cd9 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt @@ -14,13 +14,12 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.readium.adapter.pdfium.document.PdfiumDocumentFactory import org.readium.adapter.pdfium.navigator.PdfiumEngineProvider -import org.readium.adapter.pdfium.navigator.PdfiumPreferences -import org.readium.adapter.pdfium.navigator.PdfiumSettings import org.readium.navigator.demo.persistence.LocatorRepository import org.readium.navigator.demo.preferences.PreferencesManager import org.readium.navigator.demo.preferences.UserPreferencesViewModel -import org.readium.navigator.pdf.PdfNavigatorFactory +import org.readium.navigator.web.FixedWebNavigator import org.readium.navigator.web.FixedWebNavigatorFactory +import org.readium.navigator.web.location.FixedWebLocation import org.readium.navigator.web.preferences.FixedWebPreferences import org.readium.navigator.web.preferences.FixedWebSettings import org.readium.r2.shared.ExperimentalReadiumApi @@ -73,8 +72,10 @@ class ReaderOpener( val readerState = when { publication.conformsTo(Publication.Profile.EPUB) -> createFixedWebReader(url, publication, initialLocator) - publication.conformsTo(Publication.Profile.PDF) -> - createPdfReader(url, publication, initialLocator) + + /*publication.conformsTo(Publication.Profile.PDF) -> + createPdfReader(url, publication, initialLocator)*/ + else -> Try.failure(DebugError("Publication not supported")) }.getOrElse { error -> @@ -89,13 +90,13 @@ class ReaderOpener( url: AbsoluteUrl, publication: Publication, initialLocator: Locator? - ): Try, Error> { + ): Try, Error> { val navigatorFactory = FixedWebNavigatorFactory(application, publication) ?: return Try.failure(DebugError("Publication not supported")) val initialPreferences = FixedWebPreferences() - val navigatorState = navigatorFactory.createNavigator( + val navigatorState = navigatorFactory.createState( initialLocator = initialLocator, initialPreferences = initialPreferences ).getOrElse { @@ -129,7 +130,7 @@ class ReaderOpener( return Try.success(readerState) } - +/* private fun createPdfReader( url: AbsoluteUrl, publication: Publication, @@ -172,4 +173,5 @@ class ReaderOpener( return Try.success(readerState) } + */ } diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfLocations.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfLocations.kt index 7e48191ece..6ae89f486e 100644 --- a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfLocations.kt +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfLocations.kt @@ -1,8 +1,8 @@ package org.readium.navigator.pdf +import org.readium.navigator.common.GoLocation import org.readium.navigator.common.Location import org.readium.navigator.common.LocatorAdapter -import org.readium.navigator.common.TargetLocation import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.Link import org.readium.r2.shared.publication.Locator @@ -10,7 +10,7 @@ import org.readium.r2.shared.publication.Publication import org.readium.r2.shared.util.Url @ExperimentalReadiumApi -public sealed interface PdfGoLocation : TargetLocation +public sealed interface PdfGoLocation : GoLocation @ExperimentalReadiumApi public data class PageLocation( diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt index 8e98953aed..9bc12fc1fc 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt @@ -17,12 +17,15 @@ import androidx.compose.ui.unit.LayoutDirection import org.readium.navigator.common.HyperlinkListener import org.readium.navigator.common.InputListener import org.readium.navigator.common.LinkContext +import org.readium.navigator.common.NullHyperlinkListener +import org.readium.navigator.common.NullInputListener import org.readium.navigator.common.TapContext import org.readium.navigator.common.defaultHyperlinkListener import org.readium.navigator.common.defaultInputListener import org.readium.navigator.web.layout.DoubleViewportSpread import org.readium.navigator.web.layout.FixedWebReadingOrder import org.readium.navigator.web.layout.SingleViewportSpread +import org.readium.navigator.web.location.FixedWebLocation import org.readium.navigator.web.pager.NavigatorPager import org.readium.navigator.web.spread.DoubleSpreadState import org.readium.navigator.web.spread.DoubleViewportSpread @@ -41,11 +44,16 @@ import org.readium.r2.shared.util.Url @Composable public fun FixedWebNavigator( modifier: Modifier = Modifier, - state: FixedWebNavigatorState, + state: FixedWebState, windowInsets: WindowInsets = WindowInsets.displayCutout, backgroundColor: Color = MaterialTheme.colorScheme.background, - inputListener: InputListener = defaultInputListener(navigatorState = state), - hyperlinkListener: HyperlinkListener = defaultHyperlinkListener(navigatorState = state) + inputListener: InputListener = state.navigator + ?.let { defaultInputListener(navigatorState = it) } + ?: NullInputListener, + hyperlinkListener: HyperlinkListener = + state.navigator + ?.let { defaultHyperlinkListener(navigatorState = it) } + ?: NullHyperlinkListener ) { BoxWithConstraints( modifier = Modifier.fillMaxSize(), @@ -59,6 +67,14 @@ public fun FixedWebNavigator( val reverseLayout = LocalLayoutDirection.current.toReadingProgression() != state.settings.value.readingProgression + // This is barely needed as location could be computed on the state side without any + // data from the layout pass. I keep it so for demonstration purposes of the way the + // reflowable navigator could fit the architecture as well. + val spreadIndex = state.pagerState.currentPage + val itemIndex = state.layout.value.pageIndexForSpread(spreadIndex) + val itemHref = state.readingOrder.items[itemIndex].href + state.updateLocation(FixedWebLocation(itemHref)) + NavigatorPager( modifier = modifier, state = state.pagerState, diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt index 6981259ac9..7160ae9345 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt @@ -73,11 +73,11 @@ public class FixedWebNavigatorFactory private constructor( ) : Error("Could not initialize the navigator.", cause) } - public suspend fun createNavigator( + public suspend fun createState( initialLocator: Locator? = null, initialPreferences: FixedWebPreferences? = null, readingOrder: List = publication.readingOrder - ): Try { + ): Try { val items = readingOrder.map { FixedWebReadingOrderItem( href = it.url(), @@ -102,8 +102,8 @@ public class FixedWebNavigatorFactory private constructor( val preloads = preloadData() .getOrElse { return Try.failure(it) } - val navigatorState = - FixedWebNavigatorState( + val state = + FixedWebState( publicationMetadata = publication.metadata, readingOrder = FixedWebReadingOrder(items), initialPreferences = initialPreferences ?: FixedWebPreferences(), @@ -113,10 +113,10 @@ public class FixedWebNavigatorFactory private constructor( preloadedData = preloads ) - return Try.success(navigatorState) + return Try.success(state) } - private suspend fun preloadData(): Try = + private suspend fun preloadData(): Try = try { val assetsUrl = WebViewServer.assetUrl("readium/navigators/web")!! @@ -130,7 +130,7 @@ public class FixedWebNavigatorFactory private constructor( assetsUrl = assetsUrl ) - val preloadData = FixedWebNavigatorState.PreloadedData( + val preloadData = FixedWebPreloadedData( prepaginatedSingleContent = prepaginatedSingleContent, prepaginatedDoubleContent = prepaginatedDoubleContent ) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt deleted file mode 100644 index 05f4faa8ec..0000000000 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorState.kt +++ /dev/null @@ -1,152 +0,0 @@ -package org.readium.navigator.web - -import androidx.compose.animation.core.AnimationSpec -import androidx.compose.animation.core.spring -import androidx.compose.foundation.pager.PagerState -import androidx.compose.runtime.MutableState -import androidx.compose.runtime.Stable -import androidx.compose.runtime.State -import androidx.compose.runtime.derivedStateOf -import androidx.compose.runtime.mutableStateOf -import org.readium.navigator.common.Configurable -import org.readium.navigator.common.Navigator -import org.readium.navigator.common.Overflow -import org.readium.navigator.common.Overflowable -import org.readium.navigator.web.layout.FixedWebReadingOrder -import org.readium.navigator.web.layout.Layout -import org.readium.navigator.web.layout.LayoutResolver -import org.readium.navigator.web.location.FixedWebLocation -import org.readium.navigator.web.location.FixedWebTargetLocation -import org.readium.navigator.web.location.HrefLocation -import org.readium.navigator.web.preferences.FixedWebDefaults -import org.readium.navigator.web.preferences.FixedWebPreferences -import org.readium.navigator.web.preferences.FixedWebSettings -import org.readium.navigator.web.preferences.FixedWebSettingsResolver -import org.readium.navigator.web.util.WebViewClient -import org.readium.navigator.web.util.WebViewServer -import org.readium.r2.navigator.SimpleOverflow -import org.readium.r2.navigator.preferences.Axis -import org.readium.r2.navigator.preferences.Fit -import org.readium.r2.shared.ExperimentalReadiumApi -import org.readium.r2.shared.InternalReadiumApi -import org.readium.r2.shared.publication.Link -import org.readium.r2.shared.publication.Metadata - -@ExperimentalReadiumApi -@Stable -public class FixedWebNavigatorState internal constructor( - publicationMetadata: Metadata, - override val readingOrder: FixedWebReadingOrder, - initialPreferences: FixedWebPreferences, - defaults: FixedWebDefaults, - initialLocation: Int, - internal val webViewServer: WebViewServer, - internal val preloadedData: PreloadedData -) : Navigator, Configurable, Overflowable { - - init { - require(initialLocation < readingOrder.items.size) - } - - internal data class PreloadedData( - val prepaginatedSingleContent: String, - val prepaginatedDoubleContent: String - ) - - private val settingsResolver = - FixedWebSettingsResolver(publicationMetadata, defaults) - - private val layoutResolver = - LayoutResolver(readingOrder) - - public override val preferences: MutableState = - mutableStateOf(initialPreferences) - - public override val settings: State = - derivedStateOf { settingsResolver.settings(preferences.value) } - - internal val webViewClient = - WebViewClient(webViewServer) - - internal val layout: State = - derivedStateOf { - val spreads = layoutResolver.layout(settings.value) - Layout(settings.value.readingProgression, spreads) - } - - internal val fit: State = - derivedStateOf { settings.value.fit } - - internal val pagerState: PagerState = - PagerState(currentPage = layout.value.spreadIndexForPage(initialLocation)) { layout.value.spreads.size } - - private val currentItem: State = - derivedStateOf { layout.value.pageIndexForSpread(pagerState.currentPage) } - - override val location: State = - derivedStateOf { FixedWebLocation(readingOrder.items[currentItem.value].href) } - - internal fun updateLocation(location: FixedWebLocation) { - } - - override suspend fun goTo(link: Link) { - val href = link.url().removeFragment() - val location = HrefLocation(href) - goTo(location) - } - - override suspend fun goTo(targetLocation: FixedWebTargetLocation) { - when (targetLocation) { - is HrefLocation -> { - val pageIndex = checkNotNull(readingOrder.indexOfHref(targetLocation.href)) - pagerState.scrollToPage(layout.value.spreadIndexForPage(pageIndex)) - } - } - } - - override suspend fun goTo(location: FixedWebLocation) { - return goTo(HrefLocation(location.href)) - } - - public suspend fun goTo(readingOrderItem: Int) { - pagerState.scrollToPage(layout.value.spreadIndexForPage(readingOrderItem)) - } - - public suspend fun animateGoTo( - item: Int, - animationSpec: AnimationSpec = spring() - ): Unit = - pagerState.animateScrollToPage( - layout.value.spreadIndexForPage(item), - animationSpec = animationSpec - ) - - @ExperimentalReadiumApi - @OptIn(InternalReadiumApi::class) - override val overflow: State = - derivedStateOf { - SimpleOverflow( - settings.value.readingProgression, - false, - Axis.HORIZONTAL - ) - } - - override val canMoveForward: Boolean - get() = pagerState.currentPage < layout.value.spreads.size - 1 - - override val canMoveBackward: Boolean - get() = pagerState.currentPage > 0 - - override suspend fun moveForward() { - if (canMoveForward) { - pagerState.scrollToPage(pagerState.currentPage + 1) - } - } - - override suspend fun moveBackward() { - if (canMoveBackward) { - pagerState.scrollToPage(pagerState.currentPage - 1) - } - } -} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebState.kt new file mode 100644 index 0000000000..1eb6bdb02b --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebState.kt @@ -0,0 +1,227 @@ +package org.readium.navigator.web + +import androidx.compose.foundation.pager.PagerState +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.Stable +import androidx.compose.runtime.State +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.mutableStateOf +import org.readium.navigator.common.Configurable +import org.readium.navigator.common.Navigator +import org.readium.navigator.common.NavigatorInitializationState +import org.readium.navigator.common.NavigatorState +import org.readium.navigator.common.Overflow +import org.readium.navigator.common.Overflowable +import org.readium.navigator.web.layout.FixedWebReadingOrder +import org.readium.navigator.web.layout.Layout +import org.readium.navigator.web.layout.LayoutResolver +import org.readium.navigator.web.location.FixedWebGoLocation +import org.readium.navigator.web.location.FixedWebLocation +import org.readium.navigator.web.location.HrefLocation +import org.readium.navigator.web.preferences.FixedWebDefaults +import org.readium.navigator.web.preferences.FixedWebPreferences +import org.readium.navigator.web.preferences.FixedWebSettings +import org.readium.navigator.web.preferences.FixedWebSettingsResolver +import org.readium.navigator.web.util.WebViewClient +import org.readium.navigator.web.util.WebViewServer +import org.readium.r2.navigator.SimpleOverflow +import org.readium.r2.navigator.preferences.Axis +import org.readium.r2.navigator.preferences.Fit +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.InternalReadiumApi +import org.readium.r2.shared.publication.Link +import org.readium.r2.shared.publication.Metadata + +@ExperimentalReadiumApi +@Stable +public class FixedWebState internal constructor( + publicationMetadata: Metadata, + public val readingOrder: FixedWebReadingOrder, + initialPreferences: FixedWebPreferences, + defaults: FixedWebDefaults, + initialLocation: Int, + internal val webViewServer: WebViewServer, + internal val preloadedData: FixedWebPreloadedData +) : NavigatorState { + init { + require(initialLocation < readingOrder.items.size) + } + + private val settingsResolver: FixedWebSettingsResolver = + FixedWebSettingsResolver(publicationMetadata, defaults) + + internal val webViewClient: WebViewClient = + WebViewClient(webViewServer) + + private val core: FixedWebCore = + FixedWebCore( + readingOrder = readingOrder, + settingsResolver = settingsResolver, + initialPreferences = initialPreferences, + initialLocation = initialLocation + ) + + private val stateMutable: MutableState> = + mutableStateOf(NavigatorInitializationState.Pending()) + + public override val state: State> = + stateMutable + + internal val navigator: FixedWebNavigator? get() = + state.value.navigator + + public val preferences: MutableState = + core.preferences + + public val settings: State = + core.settings + + internal val layout: State = + core.layout + + internal val fit: State = + core.fit + + internal val pagerState: PagerState = + core.pagerState + + private fun initNavigatorIfNeeded(location: FixedWebLocation): FixedWebNavigator { + when (val initStateNow = stateMutable.value) { + is NavigatorInitializationState.Initialized<*> -> { + return initStateNow.navigator as FixedWebNavigator + } + is NavigatorInitializationState.Pending -> { + val navigator = FixedWebNavigator(core, location) + stateMutable.value = NavigatorInitializationState.Initialized(navigator) + return navigator + } + } + } + + internal fun updateLocation(location: FixedWebLocation) { + val navigator = initNavigatorIfNeeded(location) + navigator.updateLocation(location) + } +} + +@ExperimentalReadiumApi +@Stable +public class FixedWebNavigator internal constructor( + private val core: FixedWebCore, + initialLocation: FixedWebLocation +) : Navigator, + Configurable, + Overflowable by core { + + private val locationMutable: MutableState = + mutableStateOf(initialLocation) + + override val readingOrder: FixedWebReadingOrder = + core.readingOrder + + override val location: State = + locationMutable + + override suspend fun goTo(targetLocation: FixedWebGoLocation) { + core.goTo(targetLocation) + } + + override suspend fun goTo(location: FixedWebLocation) { + core.goTo(location) + } + + override val preferences: MutableState = + core.preferences + + override val settings: State = + core.settings + + internal fun updateLocation(location: FixedWebLocation) { + locationMutable.value = location + } + + override suspend fun goTo(link: Link) { + val href = link.url().removeFragment() + val location = HrefLocation(href) + goTo(location) + } +} + +@OptIn(ExperimentalReadiumApi::class) +internal class FixedWebCore( + val readingOrder: FixedWebReadingOrder, + private val settingsResolver: FixedWebSettingsResolver, + initialPreferences: FixedWebPreferences, + initialLocation: Int +) : Overflowable { + private val layoutResolver = + LayoutResolver(readingOrder) + + val preferences: MutableState = + mutableStateOf(initialPreferences) + + val settings: State = + derivedStateOf { settingsResolver.settings(preferences.value) } + + val layout: State = + derivedStateOf { + val spreads = layoutResolver.layout(settings.value) + Layout(settings.value.readingProgression, spreads) + } + + val fit: State = + derivedStateOf { settings.value.fit } + + val pagerState: PagerState = + PagerState( + currentPage = layout.value.spreadIndexForPage(initialLocation), + pageCount = { layout.value.spreads.size } + ) + + suspend fun goTo(targetLocation: FixedWebGoLocation) { + when (targetLocation) { + is HrefLocation -> { + val pageIndex = checkNotNull(readingOrder.indexOfHref(targetLocation.href)) + pagerState.scrollToPage(layout.value.spreadIndexForPage(pageIndex)) + } + } + } + + suspend fun goTo(location: FixedWebLocation) { + return goTo(HrefLocation(location.href)) + } + + @ExperimentalReadiumApi + @OptIn(InternalReadiumApi::class) + override val overflow: State = + derivedStateOf { + SimpleOverflow( + settings.value.readingProgression, + false, + Axis.HORIZONTAL + ) + } + + override val canMoveForward: Boolean + get() = pagerState.currentPage < layout.value.spreads.size - 1 + + override val canMoveBackward: Boolean + get() = pagerState.currentPage > 0 + + override suspend fun moveForward() { + if (canMoveForward) { + pagerState.scrollToPage(pagerState.currentPage + 1) + } + } + + override suspend fun moveBackward() { + if (canMoveBackward) { + pagerState.scrollToPage(pagerState.currentPage - 1) + } + } +} + +internal data class FixedWebPreloadedData( + val prepaginatedSingleContent: String, + val prepaginatedDoubleContent: String +) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocationTypes.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocationTypes.kt index 41af349312..f0472273df 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocationTypes.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocationTypes.kt @@ -1,7 +1,7 @@ package org.readium.navigator.web.location +import org.readium.navigator.common.GoLocation import org.readium.navigator.common.Location -import org.readium.navigator.common.TargetLocation import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.util.Url @@ -24,16 +24,16 @@ public value class TextFragment( ) @ExperimentalReadiumApi -public sealed interface FixedWebTargetLocation : TargetLocation +public sealed interface FixedWebGoLocation : GoLocation @ExperimentalReadiumApi -public sealed interface ReflowableWebTargetLocation : TargetLocation +public sealed interface ReflowableWebGoLocation : GoLocation @ExperimentalReadiumApi public data class ProgressionLocation( val href: Url, val progression: Double -) : ReflowableWebTargetLocation +) : ReflowableWebGoLocation @ExperimentalReadiumApi public data class TextLocation( @@ -41,17 +41,17 @@ public data class TextLocation( val cssSelector: String?, val textBefore: String?, val textAfter: String? -) : ReflowableWebTargetLocation +) : ReflowableWebGoLocation @ExperimentalReadiumApi public data class PositionLocation( val position: Int -) : ReflowableWebTargetLocation +) : ReflowableWebGoLocation @ExperimentalReadiumApi public data class HrefLocation( val href: Url -) : ReflowableWebTargetLocation, FixedWebTargetLocation +) : ReflowableWebGoLocation, FixedWebGoLocation @ExperimentalReadiumApi public data class ReflowableWebLocation( diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocatorAdapters.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocatorAdapters.kt index 96dc01fd91..8a2447e9d8 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocatorAdapters.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/location/LocatorAdapters.kt @@ -11,13 +11,13 @@ import org.readium.r2.shared.publication.indexOfFirstWithHref @ExperimentalReadiumApi public class FixedWebLocatorAdapter( private val publication: Publication -) : LocatorAdapter { - public fun FixedWebTargetLocation.toLocator(): Locator = +) : LocatorAdapter { + public fun FixedWebGoLocation.toLocator(): Locator = when (this) { is HrefLocation -> publication.locatorFromLink(Link(href))!! } - public override fun Locator.toGoLocation(): FixedWebTargetLocation = + public override fun Locator.toGoLocation(): FixedWebGoLocation = HrefLocation(href) override fun FixedWebLocation.toLocator(): Locator { @@ -31,7 +31,7 @@ public class FixedWebLocatorAdapter( public class ReflowableWebLocatorAdapter( private val publication: Publication, private val allowProduceHrefLocation: Boolean = false -) : LocatorAdapter { +) : LocatorAdapter { public override fun ReflowableWebLocation.toLocator(): Locator = publication.locatorFromLink(Link(href))!! .copy( @@ -46,7 +46,7 @@ public class ReflowableWebLocatorAdapter( otherLocations = buildMap { cssSelector?.let { put("cssSelector", cssSelector) } } ) - public override fun Locator.toGoLocation(): ReflowableWebTargetLocation { + public override fun Locator.toGoLocation(): ReflowableWebGoLocation { return when { text.highlight != null || text.before != null || text.after != null -> { TextLocation( From 267321917819f40ce4a5b31a509fe13f7fa1efb4 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Thu, 24 Oct 2024 11:20:52 +0200 Subject: [PATCH 52/61] Enforce hardware acceleration --- .../main/java/org/readium/navigator/web/spread/SpreadWebView.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt index cd37dc1313..cfeda9b6a3 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt @@ -1,6 +1,7 @@ package org.readium.navigator.web.spread import android.annotation.SuppressLint +import android.view.View import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -69,6 +70,7 @@ internal fun SpreadWebView( webview.isVerticalScrollBarEnabled = false webview.isHorizontalScrollBarEnabled = false webview.setBackgroundColor(backgroundColor.toArgb()) + webview.setLayerType(View.LAYER_TYPE_HARDWARE, null) } ) } From 17b9e859fcaa68168b59b3ed0c71fc8e38cb3878 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Thu, 24 Oct 2024 11:51:54 +0200 Subject: [PATCH 53/61] Cosmetic changes --- .../navigator/common/HyperlinkListener.kt | 8 +-- .../readium/navigator/common/InputListener.kt | 4 +- .../readium/navigator/demo/reader/Reader.kt | 59 +++++++++---------- .../navigator/web/FixedWebNavigator.kt | 4 +- 4 files changed, 36 insertions(+), 39 deletions(-) diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt index 11697c5949..e112091e5d 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt @@ -50,7 +50,7 @@ public object NullHyperlinkListener : HyperlinkListener { @ExperimentalReadiumApi @Composable public fun defaultHyperlinkListener( - navigatorState: Navigator<*, L, *>, + navigator: Navigator<*, L, *>, shouldFollowReadingOrderLink: (Url, LinkContext?) -> Boolean = { _, _ -> true }, // TODO: shouldFollowResourceLink: (Url, LinkContext?) -> Boolean = { _, _ -> true }, onExternalLinkActivated: (AbsoluteUrl, LinkContext?) -> Unit = { _, _ -> } @@ -61,16 +61,16 @@ public fun defaultHyperlinkListener( BackHandler(enabled = navigationHistory.value.isNotEmpty()) { val previousItem = navigationHistory.value.last() navigationHistory.value -= previousItem - coroutineScope.launch { navigatorState.goTo(previousItem) } + coroutineScope.launch { navigator.goTo(previousItem) } } val onPreFollowingReadingOrder = { - navigationHistory.value += navigatorState.location.value + navigationHistory.value += navigator.location.value } return DefaultHyperlinkListener( coroutineScope = coroutineScope, - navigatorState = navigatorState, + navigatorState = navigator, shouldFollowReadingOrderLink = shouldFollowReadingOrderLink, onPreFollowingReadingOrderLink = onPreFollowingReadingOrder, onExternalLinkActivatedDelegate = onExternalLinkActivated diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt index a37d7ba8e2..714a5258d1 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt @@ -48,7 +48,7 @@ public object NullInputListener : InputListener { @ExperimentalReadiumApi @Composable public fun defaultInputListener( - navigatorState: Overflowable, + navigator: Overflowable, fallbackListener: InputListener? = null, tapEdges: Set = setOf( DirectionalNavigationAdapter.TapEdge.Horizontal @@ -64,7 +64,7 @@ public fun defaultInputListener( return DefaultInputListener( coroutineScope, fallbackListener, - navigatorState, + navigator, tapEdges, handleTapsWhileScrolling, minimumHorizontalEdgeSize, diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt index e6a1d6ba53..4d9dae8bf8 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt @@ -38,7 +38,6 @@ import org.readium.navigator.common.InputListener import org.readium.navigator.common.Location import org.readium.navigator.common.LocatorAdapter import org.readium.navigator.common.Navigator -import org.readium.navigator.common.NavigatorInitializationState import org.readium.navigator.common.NavigatorState import org.readium.navigator.common.NullHyperlinkListener import org.readium.navigator.common.Overflowable @@ -100,6 +99,8 @@ fun > Reader( onPreferencesActivated = { showPreferences.value = !showPreferences.value } ) + val navigatorNow = readerState.navigatorState.state.value.navigator + val fallbackInputListener = remember { object : InputListener { override fun onTap(event: TapEvent, context: TapContext) { @@ -109,41 +110,37 @@ fun > Reader( } val inputListener = - when (val stateNow = readerState.navigatorState.state.value) { - is NavigatorInitializationState.Pending -> fallbackInputListener - is NavigatorInitializationState.Initialized -> { - (stateNow.navigator as? Overflowable)?.let { - defaultInputListener( - navigatorState = it, - fallbackListener = fallbackInputListener - ) - } ?: fallbackInputListener - } + if (navigatorNow == null) { + fallbackInputListener + } else { + (navigatorNow as? Overflowable)?.let { + defaultInputListener( + navigator = it, + fallbackListener = fallbackInputListener + ) + } ?: fallbackInputListener } val hyperlinkListener = - when (val stateNow = readerState.navigatorState.state.value) { - is NavigatorInitializationState.Pending -> NullHyperlinkListener - is NavigatorInitializationState.Initialized -> { - val context = LocalContext.current - defaultHyperlinkListener( - navigatorState = stateNow.navigator, - onExternalLinkActivated = { url, _ -> launchWebBrowser(context, url.toUri()) } - ) - } + if (navigatorNow == null) { + NullHyperlinkListener + } else { + val context = LocalContext.current + defaultHyperlinkListener( + navigator = navigatorNow, + onExternalLinkActivated = { url, _ -> launchWebBrowser(context, url.toUri()) } + ) } - val navigatorNow = readerState.navigatorState.state.value.navigator - - LaunchedEffect(readerState.navigatorState) { - navigatorNow ?: return@LaunchedEffect - - snapshotFlow { - navigatorNow.location.value - }.onEach { - val locator = with(readerState.locatorAdapter) { it.toLocator() } - LocatorRepository.saveLocator(readerState.url, locator) - }.launchIn(readerState.coroutineScope) + if (navigatorNow != null) { + LaunchedEffect(navigatorNow) { + snapshotFlow { + navigatorNow.location.value + }.onEach { + val locator = with(readerState.locatorAdapter) { it.toLocator() } + LocatorRepository.saveLocator(readerState.url, locator) + }.launchIn(readerState.coroutineScope) + } } when (readerState.navigatorState) { diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt index 9bc12fc1fc..f352c5fa02 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt @@ -48,11 +48,11 @@ public fun FixedWebNavigator( windowInsets: WindowInsets = WindowInsets.displayCutout, backgroundColor: Color = MaterialTheme.colorScheme.background, inputListener: InputListener = state.navigator - ?.let { defaultInputListener(navigatorState = it) } + ?.let { defaultInputListener(navigator = it) } ?: NullInputListener, hyperlinkListener: HyperlinkListener = state.navigator - ?.let { defaultHyperlinkListener(navigatorState = it) } + ?.let { defaultHyperlinkListener(navigator = it) } ?: NullHyperlinkListener ) { BoxWithConstraints( From a47afd72646aabd8aadfa0b505efc404717af415 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Thu, 24 Oct 2024 12:28:38 +0200 Subject: [PATCH 54/61] Cosmetic change --- .../navigator/common/NavigatorState.kt | 24 +++++++++---------- .../readium/navigator/demo/reader/Reader.kt | 2 +- .../readium/navigator/web/FixedWebState.kt | 17 +++++++------ 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt index 7787e9f1ea..83604141ea 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt @@ -6,20 +6,20 @@ import org.readium.r2.shared.ExperimentalReadiumApi @ExperimentalReadiumApi public interface NavigatorState> { - public val state: State> -} - -@ExperimentalReadiumApi -public sealed interface NavigatorInitializationState { + public sealed interface InitializationState { + public class Pending : InitializationState { + override val navigator: Nothing? = null + } - public val navigator: N? + public data class Initialized( + override val navigator: N + ) : InitializationState - public class Pending : NavigatorInitializationState { - - override val navigator: Nothing? = null + public val navigator: N? } - public data class Initialized( - override val navigator: N - ) : NavigatorInitializationState + public val initState: State> + + public val navigator: N? get() = + initState.value.navigator } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt index 4d9dae8bf8..2c49b6dd9b 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt @@ -99,7 +99,7 @@ fun > Reader( onPreferencesActivated = { showPreferences.value = !showPreferences.value } ) - val navigatorNow = readerState.navigatorState.state.value.navigator + val navigatorNow = readerState.navigatorState.initState.value.navigator val fallbackInputListener = remember { object : InputListener { diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebState.kt index 1eb6bdb02b..6d8c7bd85d 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebState.kt @@ -8,7 +8,6 @@ import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.mutableStateOf import org.readium.navigator.common.Configurable import org.readium.navigator.common.Navigator -import org.readium.navigator.common.NavigatorInitializationState import org.readium.navigator.common.NavigatorState import org.readium.navigator.common.Overflow import org.readium.navigator.common.Overflowable @@ -61,14 +60,14 @@ public class FixedWebState internal constructor( initialLocation = initialLocation ) - private val stateMutable: MutableState> = - mutableStateOf(NavigatorInitializationState.Pending()) + private val stateMutable: MutableState> = + mutableStateOf(NavigatorState.InitializationState.Pending()) - public override val state: State> = + public override val initState: State> = stateMutable - internal val navigator: FixedWebNavigator? get() = - state.value.navigator + override val navigator: FixedWebNavigator? get() = + initState.value.navigator public val preferences: MutableState = core.preferences @@ -87,12 +86,12 @@ public class FixedWebState internal constructor( private fun initNavigatorIfNeeded(location: FixedWebLocation): FixedWebNavigator { when (val initStateNow = stateMutable.value) { - is NavigatorInitializationState.Initialized<*> -> { + is NavigatorState.InitializationState.Initialized<*> -> { return initStateNow.navigator as FixedWebNavigator } - is NavigatorInitializationState.Pending -> { + is NavigatorState.InitializationState.Pending -> { val navigator = FixedWebNavigator(core, location) - stateMutable.value = NavigatorInitializationState.Initialized(navigator) + stateMutable.value = NavigatorState.InitializationState.Initialized(navigator) return navigator } } From 334024143be0df885b3226b92780753b5feb5312 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Thu, 24 Oct 2024 21:45:04 +0200 Subject: [PATCH 55/61] Renaming --- .../navigator/common/HyperlinkListener.kt | 6 +-- .../readium/navigator/common/InputListener.kt | 20 ++++----- .../navigator/common/NavigatorState.kt | 25 ----------- .../navigator/common/RenditionState.kt | 9 ++++ .../readium/navigator/demo/reader/Reader.kt | 18 ++++---- .../navigator/demo/reader/ReaderOpener.kt | 4 +- .../navigator/web/FixedWebNavigatorFactory.kt | 10 ++--- ...edWebNavigator.kt => FixedWebRendition.kt} | 15 ++++--- ...dWebState.kt => FixedWebRenditionState.kt} | 44 +++++++------------ 9 files changed, 63 insertions(+), 88 deletions(-) delete mode 100644 readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt create mode 100644 readium/navigators/common/src/main/java/org/readium/navigator/common/RenditionState.kt rename readium/navigators/web/src/main/java/org/readium/navigator/web/{FixedWebNavigator.kt => FixedWebRendition.kt} (94%) rename readium/navigators/web/src/main/java/org/readium/navigator/web/{FixedWebState.kt => FixedWebRenditionState.kt} (81%) diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt index e112091e5d..6096d5cb76 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt @@ -70,7 +70,7 @@ public fun defaultHyperlinkListener( return DefaultHyperlinkListener( coroutineScope = coroutineScope, - navigatorState = navigator, + navigator = navigator, shouldFollowReadingOrderLink = shouldFollowReadingOrderLink, onPreFollowingReadingOrderLink = onPreFollowingReadingOrder, onExternalLinkActivatedDelegate = onExternalLinkActivated @@ -80,7 +80,7 @@ public fun defaultHyperlinkListener( @ExperimentalReadiumApi private class DefaultHyperlinkListener( private val coroutineScope: CoroutineScope, - private val navigatorState: Navigator<*, L, *>, + private val navigator: Navigator<*, L, *>, private val shouldFollowReadingOrderLink: (Url, LinkContext?) -> Boolean, private val onPreFollowingReadingOrderLink: () -> Unit, private val onExternalLinkActivatedDelegate: (AbsoluteUrl, LinkContext?) -> Unit @@ -89,7 +89,7 @@ private class DefaultHyperlinkListener( override fun onReadingOrderLinkActivated(url: Url, context: LinkContext?) { if (shouldFollowReadingOrderLink(url, context)) { onPreFollowingReadingOrderLink() - coroutineScope.launch { navigatorState.goTo(Link(url)) } + coroutineScope.launch { navigator.goTo(Link(url)) } } } diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt index 714a5258d1..7d93f449a2 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/InputListener.kt @@ -78,7 +78,7 @@ public fun defaultInputListener( private class DefaultInputListener( private val coroutineScope: CoroutineScope, private val fallbackListener: InputListener?, - private val navigatorState: Overflowable, + private val navigator: Overflowable, private val tapEdges: Set, private val handleTapsWhileScrolling: Boolean, private val minimumHorizontalEdgeSize: Dp, @@ -94,7 +94,7 @@ private class DefaultInputListener( } private fun handleTap(event: TapEvent, context: TapContext): Boolean { - if (navigatorState.overflow.value.scroll && !handleTapsWhileScrolling) { + if (navigator.overflow.value.scroll && !handleTapsWhileScrolling) { return false } @@ -107,11 +107,11 @@ private class DefaultInputListener( val leftRange = 0.0.dp..horizontalEdgeSize val rightRange = (width - horizontalEdgeSize)..width - if (event.offset.x in rightRange && navigatorState.canMoveRight) { - coroutineScope.launch { navigatorState.moveRight() } + if (event.offset.x in rightRange && navigator.canMoveRight) { + coroutineScope.launch { navigator.moveRight() } return true - } else if (event.offset.x in leftRange && navigatorState.canMoveLeft) { - coroutineScope.launch { navigatorState.moveLeft() } + } else if (event.offset.x in leftRange && navigator.canMoveLeft) { + coroutineScope.launch { navigator.moveLeft() } return true } } @@ -125,11 +125,11 @@ private class DefaultInputListener( val topRange = 0.0.dp..verticalEdgeSize val bottomRange = (height - verticalEdgeSize)..height - if (event.offset.y in bottomRange && navigatorState.canMoveForward) { - coroutineScope.launch { navigatorState.moveForward() } + if (event.offset.y in bottomRange && navigator.canMoveForward) { + coroutineScope.launch { navigator.moveForward() } return true - } else if (event.offset.y in topRange && navigatorState.canMoveBackward) { - coroutineScope.launch { navigatorState.moveBackward() } + } else if (event.offset.y in topRange && navigator.canMoveBackward) { + coroutineScope.launch { navigator.moveBackward() } return true } } diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt deleted file mode 100644 index 83604141ea..0000000000 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/NavigatorState.kt +++ /dev/null @@ -1,25 +0,0 @@ -package org.readium.navigator.common - -import androidx.compose.runtime.State -import org.readium.r2.shared.ExperimentalReadiumApi - -@ExperimentalReadiumApi -public interface NavigatorState> { - - public sealed interface InitializationState { - public class Pending : InitializationState { - override val navigator: Nothing? = null - } - - public data class Initialized( - override val navigator: N - ) : InitializationState - - public val navigator: N? - } - - public val initState: State> - - public val navigator: N? get() = - initState.value.navigator -} diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/RenditionState.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/RenditionState.kt new file mode 100644 index 0000000000..832988f437 --- /dev/null +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/RenditionState.kt @@ -0,0 +1,9 @@ +package org.readium.navigator.common + +import org.readium.r2.shared.ExperimentalReadiumApi + +@ExperimentalReadiumApi +public interface RenditionState> { + + public val navigator: N? +} diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt index 2c49b6dd9b..4e4f9db6eb 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt @@ -38,9 +38,9 @@ import org.readium.navigator.common.InputListener import org.readium.navigator.common.Location import org.readium.navigator.common.LocatorAdapter import org.readium.navigator.common.Navigator -import org.readium.navigator.common.NavigatorState import org.readium.navigator.common.NullHyperlinkListener import org.readium.navigator.common.Overflowable +import org.readium.navigator.common.RenditionState import org.readium.navigator.common.TapContext import org.readium.navigator.common.TapEvent import org.readium.navigator.common.defaultHyperlinkListener @@ -49,8 +49,8 @@ import org.readium.navigator.demo.persistence.LocatorRepository import org.readium.navigator.demo.preferences.UserPreferences import org.readium.navigator.demo.preferences.UserPreferencesViewModel import org.readium.navigator.demo.util.launchWebBrowser -import org.readium.navigator.web.FixedWebNavigator -import org.readium.navigator.web.FixedWebState +import org.readium.navigator.web.FixedWebRendition +import org.readium.navigator.web.FixedWebRenditionState import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.Publication import org.readium.r2.shared.util.AbsoluteUrl @@ -60,7 +60,7 @@ data class ReaderState>( val url: AbsoluteUrl, val coroutineScope: CoroutineScope, val publication: Publication, - val navigatorState: NavigatorState, + val renditionState: RenditionState, val preferencesViewModel: UserPreferencesViewModel<*, *>, val locatorAdapter: LocatorAdapter ) { @@ -99,7 +99,7 @@ fun > Reader( onPreferencesActivated = { showPreferences.value = !showPreferences.value } ) - val navigatorNow = readerState.navigatorState.initState.value.navigator + val navigatorNow = readerState.renditionState.controllerState.value.navigator val fallbackInputListener = remember { object : InputListener { @@ -143,11 +143,11 @@ fun > Reader( } } - when (readerState.navigatorState) { - is FixedWebState -> { - FixedWebNavigator( + when (readerState.renditionState) { + is FixedWebRenditionState -> { + FixedWebRendition( modifier = Modifier.fillMaxSize(), - state = readerState.navigatorState, + state = readerState.renditionState, inputListener = inputListener, hyperlinkListener = hyperlinkListener ) diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt index 4db2904cd9..daf58eeccc 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt @@ -96,7 +96,7 @@ class ReaderOpener( val initialPreferences = FixedWebPreferences() - val navigatorState = navigatorFactory.createState( + val navigatorState = navigatorFactory.createRenditionState( initialLocator = initialLocator, initialPreferences = initialPreferences ).getOrElse { @@ -123,7 +123,7 @@ class ReaderOpener( url = url, coroutineScope = coroutineScope, publication = publication, - navigatorState = navigatorState, + renditionState = navigatorState, preferencesViewModel = preferencesViewModel, locatorAdapter = locatorAdapter ) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt index 7160ae9345..f3588f92b7 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt @@ -73,11 +73,11 @@ public class FixedWebNavigatorFactory private constructor( ) : Error("Could not initialize the navigator.", cause) } - public suspend fun createState( + public suspend fun createRenditionState( initialLocator: Locator? = null, initialPreferences: FixedWebPreferences? = null, readingOrder: List = publication.readingOrder - ): Try { + ): Try { val items = readingOrder.map { FixedWebReadingOrderItem( href = it.url(), @@ -103,7 +103,7 @@ public class FixedWebNavigatorFactory private constructor( .getOrElse { return Try.failure(it) } val state = - FixedWebState( + FixedWebRenditionState( publicationMetadata = publication.metadata, readingOrder = FixedWebReadingOrder(items), initialPreferences = initialPreferences ?: FixedWebPreferences(), @@ -131,8 +131,8 @@ public class FixedWebNavigatorFactory private constructor( ) val preloadData = FixedWebPreloadedData( - prepaginatedSingleContent = prepaginatedSingleContent, - prepaginatedDoubleContent = prepaginatedDoubleContent + fixedSingleContent = prepaginatedSingleContent, + fixedDoubleContent = prepaginatedDoubleContent ) Try.success(preloadData) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRendition.kt similarity index 94% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRendition.kt index f352c5fa02..887f1e28f0 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigator.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRendition.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.displayCutout import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Modifier @@ -42,9 +43,9 @@ import org.readium.r2.shared.util.Url @ExperimentalReadiumApi @Composable -public fun FixedWebNavigator( +public fun FixedWebRendition( modifier: Modifier = Modifier, - state: FixedWebState, + state: FixedWebRenditionState, windowInsets: WindowInsets = WindowInsets.displayCutout, backgroundColor: Color = MaterialTheme.colorScheme.background, inputListener: InputListener = state.navigator @@ -75,6 +76,8 @@ public fun FixedWebNavigator( val itemHref = state.readingOrder.items[itemIndex].href state.updateLocation(FixedWebLocation(itemHref)) + val fitState = remember { derivedStateOf { state.settings.value.fit } } + NavigatorPager( modifier = modifier, state = state.pagerState, @@ -86,11 +89,11 @@ public fun FixedWebNavigator( is SingleViewportSpread -> { val spreadState = remember { SingleSpreadState( - htmlData = state.preloadedData.prepaginatedSingleContent, + htmlData = state.preloadedData.fixedSingleContent, publicationBaseUrl = WebViewServer.publicationBaseHref, webViewClient = state.webViewClient, spread = spread, - fit = state.fit, + fit = fitState, displayArea = displayArea ) } @@ -107,11 +110,11 @@ public fun FixedWebNavigator( is DoubleViewportSpread -> { val spreadState = remember { DoubleSpreadState( - htmlData = state.preloadedData.prepaginatedDoubleContent, + htmlData = state.preloadedData.fixedDoubleContent, publicationBaseUrl = WebViewServer.publicationBaseHref, webViewClient = state.webViewClient, spread = spread, - fit = state.fit, + fit = fitState, displayArea = displayArea ) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRenditionState.kt similarity index 81% rename from readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebState.kt rename to readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRenditionState.kt index 6d8c7bd85d..acfb71baca 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRenditionState.kt @@ -8,9 +8,9 @@ import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.mutableStateOf import org.readium.navigator.common.Configurable import org.readium.navigator.common.Navigator -import org.readium.navigator.common.NavigatorState import org.readium.navigator.common.Overflow import org.readium.navigator.common.Overflowable +import org.readium.navigator.common.RenditionState import org.readium.navigator.web.layout.FixedWebReadingOrder import org.readium.navigator.web.layout.Layout import org.readium.navigator.web.layout.LayoutResolver @@ -33,7 +33,7 @@ import org.readium.r2.shared.publication.Metadata @ExperimentalReadiumApi @Stable -public class FixedWebState internal constructor( +public class FixedWebRenditionState internal constructor( publicationMetadata: Metadata, public val readingOrder: FixedWebReadingOrder, initialPreferences: FixedWebPreferences, @@ -41,7 +41,7 @@ public class FixedWebState internal constructor( initialLocation: Int, internal val webViewServer: WebViewServer, internal val preloadedData: FixedWebPreloadedData -) : NavigatorState { +) : RenditionState { init { require(initialLocation < readingOrder.items.size) } @@ -60,14 +60,11 @@ public class FixedWebState internal constructor( initialLocation = initialLocation ) - private val stateMutable: MutableState> = - mutableStateOf(NavigatorState.InitializationState.Pending()) - - public override val initState: State> = - stateMutable + private val navigatorState: MutableState = + mutableStateOf(null) override val navigator: FixedWebNavigator? get() = - initState.value.navigator + navigatorState.value public val preferences: MutableState = core.preferences @@ -78,28 +75,19 @@ public class FixedWebState internal constructor( internal val layout: State = core.layout - internal val fit: State = - core.fit - internal val pagerState: PagerState = core.pagerState - private fun initNavigatorIfNeeded(location: FixedWebLocation): FixedWebNavigator { - when (val initStateNow = stateMutable.value) { - is NavigatorState.InitializationState.Initialized<*> -> { - return initStateNow.navigator as FixedWebNavigator - } - is NavigatorState.InitializationState.Pending -> { - val navigator = FixedWebNavigator(core, location) - stateMutable.value = NavigatorState.InitializationState.Initialized(navigator) - return navigator - } - } + internal fun updateLocation(location: FixedWebLocation) { + initNavigatorIfNeeded(location) + navigator!!.updateLocation(location) } - internal fun updateLocation(location: FixedWebLocation) { - val navigator = initNavigatorIfNeeded(location) - navigator.updateLocation(location) + private fun initNavigatorIfNeeded(location: FixedWebLocation) { + if (navigator == null) { + val navigator = FixedWebNavigator(core, location) + navigatorState.value = navigator + } } } @@ -221,6 +209,6 @@ internal class FixedWebCore( } internal data class FixedWebPreloadedData( - val prepaginatedSingleContent: String, - val prepaginatedDoubleContent: String + val fixedSingleContent: String, + val fixedDoubleContent: String ) From 4f131d0f122823adc86a79d783b3532961320384 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Thu, 24 Oct 2024 23:01:53 +0200 Subject: [PATCH 56/61] Split up and clarify fixed web rendition state --- .../readium/navigator/demo/reader/Reader.kt | 31 +-- .../navigator/demo/reader/ReaderOpener.kt | 20 +- .../navigator/web/FixedWebNavigatorFactory.kt | 16 +- .../navigator/web/FixedWebRendition.kt | 18 +- .../navigator/web/FixedWebRenditionState.kt | 178 +++++++++--------- .../readium/navigator/web/layout/Layout.kt | 4 + 6 files changed, 134 insertions(+), 133 deletions(-) diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt index 4e4f9db6eb..1134bd0f54 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt @@ -62,7 +62,8 @@ data class ReaderState>( val publication: Publication, val renditionState: RenditionState, val preferencesViewModel: UserPreferencesViewModel<*, *>, - val locatorAdapter: LocatorAdapter + val locatorAdapter: LocatorAdapter, + val onNavigatorCreated: (N) -> Unit ) { fun close() { @@ -99,7 +100,22 @@ fun > Reader( onPreferencesActivated = { showPreferences.value = !showPreferences.value } ) - val navigatorNow = readerState.renditionState.controllerState.value.navigator + val navigatorNow = readerState.renditionState.navigator + + if (navigatorNow != null) { + LaunchedEffect(navigatorNow) { + readerState.onNavigatorCreated(navigatorNow) + } + + LaunchedEffect(navigatorNow) { + snapshotFlow { + navigatorNow.location.value + }.onEach { + val locator = with(readerState.locatorAdapter) { it.toLocator() } + LocatorRepository.saveLocator(readerState.url, locator) + }.launchIn(readerState.coroutineScope) + } + } val fallbackInputListener = remember { object : InputListener { @@ -132,17 +148,6 @@ fun > Reader( ) } - if (navigatorNow != null) { - LaunchedEffect(navigatorNow) { - snapshotFlow { - navigatorNow.location.value - }.onEach { - val locator = with(readerState.locatorAdapter) { it.toLocator() } - LocatorRepository.saveLocator(readerState.url, locator) - }.launchIn(readerState.coroutineScope) - } - } - when (readerState.renditionState) { is FixedWebRenditionState -> { FixedWebRendition( diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt index daf58eeccc..84bde3c3ef 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/ReaderOpener.kt @@ -96,8 +96,12 @@ class ReaderOpener( val initialPreferences = FixedWebPreferences() + val locatorAdapter = navigatorFactory.createLocatorAdapter() + + val initialLocation = with(locatorAdapter) { initialLocator?.toGoLocation() } + val navigatorState = navigatorFactory.createRenditionState( - initialLocator = initialLocator, + initialLocation = initialLocation, initialPreferences = initialPreferences ).getOrElse { return Try.failure(it) @@ -112,12 +116,11 @@ class ReaderOpener( createPreferencesEditor = navigatorFactory::createPreferencesEditor ) - preferencesViewModel.preferences - .onEach { - navigatorState.preferences.value = it - }.launchIn(coroutineScope) - - val locatorAdapter = navigatorFactory.createLocatorAdapter() + val onNavigatorCreated: (FixedWebNavigator) -> Unit = { navigator -> + preferencesViewModel.preferences + .onEach { navigator.preferences.value = it } + .launchIn(coroutineScope) + } val readerState = ReaderState( url = url, @@ -125,7 +128,8 @@ class ReaderOpener( publication = publication, renditionState = navigatorState, preferencesViewModel = preferencesViewModel, - locatorAdapter = locatorAdapter + locatorAdapter = locatorAdapter, + onNavigatorCreated = onNavigatorCreated ) return Try.success(readerState) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt index f3588f92b7..ca8dcd6d59 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt @@ -10,21 +10,19 @@ import android.app.Application import java.io.IOException import org.readium.navigator.web.layout.FixedWebReadingOrder import org.readium.navigator.web.layout.FixedWebReadingOrderItem +import org.readium.navigator.web.location.FixedWebGoLocation import org.readium.navigator.web.location.FixedWebLocatorAdapter +import org.readium.navigator.web.location.HrefLocation import org.readium.navigator.web.preferences.FixedWebDefaults import org.readium.navigator.web.preferences.FixedWebPreferences import org.readium.navigator.web.preferences.FixedWebPreferencesEditor import org.readium.navigator.web.util.WebViewServer import org.readium.navigator.web.webapi.FixedDoubleApi import org.readium.navigator.web.webapi.FixedSingleApi -import org.readium.r2.navigator.extensions.normalizeLocator -import org.readium.r2.shared.DelicateReadiumApi import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.Link -import org.readium.r2.shared.publication.Locator import org.readium.r2.shared.publication.Publication import org.readium.r2.shared.publication.epub.EpubLayout -import org.readium.r2.shared.publication.indexOfFirstWithHref import org.readium.r2.shared.publication.presentation.page import org.readium.r2.shared.publication.presentation.presentation import org.readium.r2.shared.util.ThrowableError @@ -32,7 +30,6 @@ import org.readium.r2.shared.util.Try import org.readium.r2.shared.util.getOrElse @ExperimentalReadiumApi -@OptIn(DelicateReadiumApi::class) public class FixedWebNavigatorFactory private constructor( private val application: Application, private val publication: Publication, @@ -74,7 +71,7 @@ public class FixedWebNavigatorFactory private constructor( } public suspend fun createRenditionState( - initialLocator: Locator? = null, + initialLocation: FixedWebGoLocation? = null, initialPreferences: FixedWebPreferences? = null, readingOrder: List = publication.readingOrder ): Try { @@ -85,11 +82,6 @@ public class FixedWebNavigatorFactory private constructor( ) } - val initialIndex = initialLocator - ?.let { publication.normalizeLocator(it) } - ?.let { readingOrder.indexOfFirstWithHref(it.href) } - ?: 0 - val webViewServer = WebViewServer( application = application, @@ -108,7 +100,7 @@ public class FixedWebNavigatorFactory private constructor( readingOrder = FixedWebReadingOrder(items), initialPreferences = initialPreferences ?: FixedWebPreferences(), defaults = defaults, - initialLocation = initialIndex, + initialLocation = initialLocation ?: HrefLocation(items[0].href), webViewServer = webViewServer, preloadedData = preloads ) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRendition.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRendition.kt index 887f1e28f0..1d81d22a90 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRendition.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRendition.kt @@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.displayCutout import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable -import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Modifier @@ -65,27 +64,28 @@ public fun FixedWebRendition( val safeDrawingPadding = windowInsets.asAbsolutePaddingValues() val displayArea = rememberUpdatedState(DisplayArea(viewportSize, safeDrawingPadding)) + val readingProgression = + state.layoutDelegate.settings.value.readingProgression + val reverseLayout = - LocalLayoutDirection.current.toReadingProgression() != state.settings.value.readingProgression + LocalLayoutDirection.current.toReadingProgression() != readingProgression // This is barely needed as location could be computed on the state side without any // data from the layout pass. I keep it so for demonstration purposes of the way the // reflowable navigator could fit the architecture as well. val spreadIndex = state.pagerState.currentPage - val itemIndex = state.layout.value.pageIndexForSpread(spreadIndex) + val itemIndex = state.layoutDelegate.layout.value.pageIndexForSpread(spreadIndex) val itemHref = state.readingOrder.items[itemIndex].href state.updateLocation(FixedWebLocation(itemHref)) - val fitState = remember { derivedStateOf { state.settings.value.fit } } - NavigatorPager( modifier = modifier, state = state.pagerState, beyondViewportPageCount = 2, - key = { index -> state.layout.value.pageIndexForSpread(index) }, + key = { index -> state.layoutDelegate.layout.value.pageIndexForSpread(index) }, reverseLayout = reverseLayout ) { index -> - when (val spread = state.layout.value.spreads[index]) { + when (val spread = state.layoutDelegate.layout.value.spreads[index]) { is SingleViewportSpread -> { val spreadState = remember { SingleSpreadState( @@ -93,7 +93,7 @@ public fun FixedWebRendition( publicationBaseUrl = WebViewServer.publicationBaseHref, webViewClient = state.webViewClient, spread = spread, - fit = fitState, + fit = state.layoutDelegate.fit, displayArea = displayArea ) } @@ -114,7 +114,7 @@ public fun FixedWebRendition( publicationBaseUrl = WebViewServer.publicationBaseHref, webViewClient = state.webViewClient, spread = spread, - fit = fitState, + fit = state.layoutDelegate.fit, displayArea = displayArea ) } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRenditionState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRenditionState.kt index acfb71baca..996b2e2148 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRenditionState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRenditionState.kt @@ -34,31 +34,14 @@ import org.readium.r2.shared.publication.Metadata @ExperimentalReadiumApi @Stable public class FixedWebRenditionState internal constructor( - publicationMetadata: Metadata, public val readingOrder: FixedWebReadingOrder, - initialPreferences: FixedWebPreferences, + publicationMetadata: Metadata, defaults: FixedWebDefaults, - initialLocation: Int, + initialPreferences: FixedWebPreferences, + initialLocation: FixedWebGoLocation, internal val webViewServer: WebViewServer, internal val preloadedData: FixedWebPreloadedData ) : RenditionState { - init { - require(initialLocation < readingOrder.items.size) - } - - private val settingsResolver: FixedWebSettingsResolver = - FixedWebSettingsResolver(publicationMetadata, defaults) - - internal val webViewClient: WebViewClient = - WebViewClient(webViewServer) - - private val core: FixedWebCore = - FixedWebCore( - readingOrder = readingOrder, - settingsResolver = settingsResolver, - initialPreferences = initialPreferences, - initialLocation = initialLocation - ) private val navigatorState: MutableState = mutableStateOf(null) @@ -66,88 +49,88 @@ public class FixedWebRenditionState internal constructor( override val navigator: FixedWebNavigator? get() = navigatorState.value - public val preferences: MutableState = - core.preferences + internal val layoutDelegate: LayoutDelegate = + LayoutDelegate( + readingOrder, + publicationMetadata, + defaults, + initialPreferences + ) - public val settings: State = - core.settings + internal val webViewClient: WebViewClient = + WebViewClient(webViewServer) - internal val layout: State = - core.layout + internal val pagerState: PagerState = run { + val initialPage = when (initialLocation) { + is HrefLocation -> layoutDelegate.layout.value.spreadIndexForPage(initialLocation.href) + } - internal val pagerState: PagerState = - core.pagerState + PagerState( + currentPage = layoutDelegate.layout.value.spreadIndexForPage(initialPage), + pageCount = { layoutDelegate.layout.value.spreads.size } + ) + } + + private lateinit var navigationDelegate: NavigationDelegate internal fun updateLocation(location: FixedWebLocation) { initNavigatorIfNeeded(location) - navigator!!.updateLocation(location) + navigationDelegate.updateLocation(location) } private fun initNavigatorIfNeeded(location: FixedWebLocation) { - if (navigator == null) { - val navigator = FixedWebNavigator(core, location) - navigatorState.value = navigator + if (navigator != null) { + return } + + navigationDelegate = + NavigationDelegate( + readingOrder, + pagerState, + layoutDelegate.layout, + layoutDelegate.settings, + location + ) + navigatorState.value = + FixedWebNavigator( + navigationDelegate, + layoutDelegate + ) } } @ExperimentalReadiumApi @Stable public class FixedWebNavigator internal constructor( - private val core: FixedWebCore, - initialLocation: FixedWebLocation -) : Navigator, - Configurable, - Overflowable by core { - - private val locationMutable: MutableState = - mutableStateOf(initialLocation) - - override val readingOrder: FixedWebReadingOrder = - core.readingOrder - - override val location: State = - locationMutable - - override suspend fun goTo(targetLocation: FixedWebGoLocation) { - core.goTo(targetLocation) - } - - override suspend fun goTo(location: FixedWebLocation) { - core.goTo(location) - } - - override val preferences: MutableState = - core.preferences + private val navigationDelegate: NavigationDelegate, + layoutDelegate: LayoutDelegate +) : Navigator by navigationDelegate, + Overflowable by navigationDelegate, + Configurable by layoutDelegate - override val settings: State = - core.settings +internal data class FixedWebPreloadedData( + val fixedSingleContent: String, + val fixedDoubleContent: String +) - internal fun updateLocation(location: FixedWebLocation) { - locationMutable.value = location - } +@OptIn(ExperimentalReadiumApi::class) +internal class LayoutDelegate( + readingOrder: FixedWebReadingOrder, + publicationMetadata: Metadata, + defaults: FixedWebDefaults, + initialPreferences: FixedWebPreferences +) : Configurable { - override suspend fun goTo(link: Link) { - val href = link.url().removeFragment() - val location = HrefLocation(href) - goTo(location) - } -} + private val settingsResolver: FixedWebSettingsResolver = + FixedWebSettingsResolver(publicationMetadata, defaults) -@OptIn(ExperimentalReadiumApi::class) -internal class FixedWebCore( - val readingOrder: FixedWebReadingOrder, - private val settingsResolver: FixedWebSettingsResolver, - initialPreferences: FixedWebPreferences, - initialLocation: Int -) : Overflowable { private val layoutResolver = LayoutResolver(readingOrder) - val preferences: MutableState = + override val preferences: MutableState = mutableStateOf(initialPreferences) - val settings: State = + override val settings: State = derivedStateOf { settingsResolver.settings(preferences.value) } val layout: State = @@ -158,14 +141,34 @@ internal class FixedWebCore( val fit: State = derivedStateOf { settings.value.fit } +} - val pagerState: PagerState = - PagerState( - currentPage = layout.value.spreadIndexForPage(initialLocation), - pageCount = { layout.value.spreads.size } - ) +@OptIn(ExperimentalReadiumApi::class, InternalReadiumApi::class) +internal class NavigationDelegate( + override val readingOrder: FixedWebReadingOrder, + private val pagerState: PagerState, + private val layout: State, + private val settings: State, + initialLocation: FixedWebLocation +) : Navigator, Overflowable { - suspend fun goTo(targetLocation: FixedWebGoLocation) { + private val locationMutable: MutableState = + mutableStateOf(initialLocation) + + internal fun updateLocation(location: FixedWebLocation) { + locationMutable.value = location + } + + override val location: State = + locationMutable + + override suspend fun goTo(link: Link) { + val href = link.url().removeFragment() + val location = HrefLocation(href) + goTo(location) + } + + override suspend fun goTo(targetLocation: FixedWebGoLocation) { when (targetLocation) { is HrefLocation -> { val pageIndex = checkNotNull(readingOrder.indexOfHref(targetLocation.href)) @@ -174,12 +177,10 @@ internal class FixedWebCore( } } - suspend fun goTo(location: FixedWebLocation) { + override suspend fun goTo(location: FixedWebLocation) { return goTo(HrefLocation(location.href)) } - @ExperimentalReadiumApi - @OptIn(InternalReadiumApi::class) override val overflow: State = derivedStateOf { SimpleOverflow( @@ -207,8 +208,3 @@ internal class FixedWebCore( } } } - -internal data class FixedWebPreloadedData( - val fixedSingleContent: String, - val fixedDoubleContent: String -) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Layout.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Layout.kt index e572d2a374..f2f7a31370 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Layout.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/Layout.kt @@ -11,6 +11,10 @@ internal class Layout( val spreads: List ) { + fun spreadIndexForPage(href: Url): Int = spreads + .indexOfFirst { href in it.pages.map { page -> page.href } } + .also { check(it != -1) } + fun spreadIndexForPage(pageIndex: Int): Int = spreads .indexOfFirst { pageIndex in it.pages.map { page -> page.index } } .also { check(it != -1) } From 0d31e1de433bcd5e2f50a507ba336627078b9453 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Thu, 24 Oct 2024 23:30:25 +0200 Subject: [PATCH 57/61] No longer exposes reading order --- .../readium/navigator/common/HyperlinkListener.kt | 4 ++-- .../java/org/readium/navigator/common/Navigator.kt | 6 ++---- .../org/readium/navigator/common/RenditionState.kt | 2 +- .../java/org/readium/navigator/demo/reader/Reader.kt | 4 ++-- .../org/readium/navigator/pdf/PdfNavigatorFactory.kt | 6 ------ .../org/readium/navigator/pdf/PdfNavigatorState.kt | 11 +++++------ .../readium/navigator/web/FixedWebRenditionState.kt | 12 ++++++------ 7 files changed, 18 insertions(+), 27 deletions(-) diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt index 6096d5cb76..ee864c8028 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/HyperlinkListener.kt @@ -50,7 +50,7 @@ public object NullHyperlinkListener : HyperlinkListener { @ExperimentalReadiumApi @Composable public fun defaultHyperlinkListener( - navigator: Navigator<*, L, *>, + navigator: Navigator, shouldFollowReadingOrderLink: (Url, LinkContext?) -> Boolean = { _, _ -> true }, // TODO: shouldFollowResourceLink: (Url, LinkContext?) -> Boolean = { _, _ -> true }, onExternalLinkActivated: (AbsoluteUrl, LinkContext?) -> Unit = { _, _ -> } @@ -80,7 +80,7 @@ public fun defaultHyperlinkListener( @ExperimentalReadiumApi private class DefaultHyperlinkListener( private val coroutineScope: CoroutineScope, - private val navigator: Navigator<*, L, *>, + private val navigator: Navigator, private val shouldFollowReadingOrderLink: (Url, LinkContext?) -> Boolean, private val onPreFollowingReadingOrderLink: () -> Unit, private val onExternalLinkActivatedDelegate: (AbsoluteUrl, LinkContext?) -> Unit diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt index ec36062d46..5605c7396c 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt @@ -7,15 +7,13 @@ import org.readium.r2.shared.publication.Link import org.readium.r2.shared.util.Url @ExperimentalReadiumApi -public interface Navigator { - - public val readingOrder: R +public interface Navigator { public val location: State public suspend fun goTo(location: L) - public suspend fun goTo(targetLocation: G) + public suspend fun goTo(location: G) public suspend fun goTo(link: Link) } diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/RenditionState.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/RenditionState.kt index 832988f437..b1a2b94ffc 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/RenditionState.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/RenditionState.kt @@ -3,7 +3,7 @@ package org.readium.navigator.common import org.readium.r2.shared.ExperimentalReadiumApi @ExperimentalReadiumApi -public interface RenditionState> { +public interface RenditionState> { public val navigator: N? } diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt index 1134bd0f54..5d27fddda0 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/reader/Reader.kt @@ -56,7 +56,7 @@ import org.readium.r2.shared.publication.Publication import org.readium.r2.shared.util.AbsoluteUrl import org.readium.r2.shared.util.toUri -data class ReaderState>( +data class ReaderState>( val url: AbsoluteUrl, val coroutineScope: CoroutineScope, val publication: Publication, @@ -74,7 +74,7 @@ data class ReaderState>( @OptIn(ExperimentalMaterial3Api::class) @Composable -fun > Reader( +fun > Reader( readerState: ReaderState, fullScreenState: MutableState ) { diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt index e9c11aa38d..0deaa4e91b 100644 --- a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorFactory.kt @@ -26,11 +26,6 @@ public class PdfNavigatorFactory, E : Preferenc initialLocator: Locator? = null, initialPreferences: P? = null ): Try, Nothing> { - val readingOrder = - PdfReadingOrder( - publication.readingOrder.map { PdfReadingOrderItem(it.url()) } - ) - val actualInitialLocator = initialLocator ?: publication.locatorFromLink(publication.readingOrder[0])!! @@ -46,7 +41,6 @@ public class PdfNavigatorFactory, E : Preferenc val navigatorState = PdfNavigatorState( - readingOrder, legacyNavigatorFactory, settingsResolver, actualInitialLocator, diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt index 18cff948f8..dcc903c41a 100644 --- a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt +++ b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfNavigatorState.kt @@ -17,12 +17,11 @@ import org.readium.r2.shared.publication.Locator @ExperimentalReadiumApi @Stable public class PdfNavigatorState> internal constructor( - override val readingOrder: PdfReadingOrder, internal val pdfNavigatorFactory: PdfNavigatorFactory, private val settingsResolver: (P) -> S, initialLocator: Locator, initialPreferences: P -) : Navigator, Configurable { +) : Navigator, Configurable { override val preferences: MutableState

      = mutableStateOf(initialPreferences) @@ -49,12 +48,12 @@ public class PdfNavigatorState> internal constr pendingLocator.value = locator.value.copyWithLocations(position = location.page) } - override suspend fun goTo(targetLocation: PdfGoLocation) { - pendingLocator.value = when (targetLocation) { + override suspend fun goTo(location: PdfGoLocation) { + pendingLocator.value = when (location) { is PositionLocation -> locator.value.copyWithLocations( - position = targetLocation.position + position = location.position ) - is PageLocation -> locator.value.copyWithLocations(position = targetLocation.page) + is PageLocation -> locator.value.copyWithLocations(position = location.page) } } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRenditionState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRenditionState.kt index 996b2e2148..8e6af24c9f 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRenditionState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRenditionState.kt @@ -104,7 +104,7 @@ public class FixedWebRenditionState internal constructor( public class FixedWebNavigator internal constructor( private val navigationDelegate: NavigationDelegate, layoutDelegate: LayoutDelegate -) : Navigator by navigationDelegate, +) : Navigator by navigationDelegate, Overflowable by navigationDelegate, Configurable by layoutDelegate @@ -145,12 +145,12 @@ internal class LayoutDelegate( @OptIn(ExperimentalReadiumApi::class, InternalReadiumApi::class) internal class NavigationDelegate( - override val readingOrder: FixedWebReadingOrder, + private val readingOrder: FixedWebReadingOrder, private val pagerState: PagerState, private val layout: State, private val settings: State, initialLocation: FixedWebLocation -) : Navigator, Overflowable { +) : Navigator, Overflowable { private val locationMutable: MutableState = mutableStateOf(initialLocation) @@ -168,10 +168,10 @@ internal class NavigationDelegate( goTo(location) } - override suspend fun goTo(targetLocation: FixedWebGoLocation) { - when (targetLocation) { + override suspend fun goTo(location: FixedWebGoLocation) { + when (location) { is HrefLocation -> { - val pageIndex = checkNotNull(readingOrder.indexOfHref(targetLocation.href)) + val pageIndex = checkNotNull(readingOrder.indexOfHref(location.href)) pagerState.scrollToPage(layout.value.spreadIndexForPage(pageIndex)) } } From 82e2736d1cf25c95cffdc9805a9537f91dd45d2a Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Fri, 25 Oct 2024 09:46:59 +0200 Subject: [PATCH 58/61] Make ReadingOrder internal --- .../org/readium/navigator/common/Navigator.kt | 17 -------------- .../readium/navigator/pdf/PdfReadingOrder.kt | 15 ------------ .../navigator/web/FixedWebNavigatorFactory.kt | 8 +++---- .../navigator/web/FixedWebRendition.kt | 4 ++-- .../navigator/web/FixedWebRenditionState.kt | 8 +++---- .../web/layout/FixedWebReadingOrder.kt | 17 -------------- .../navigator/web/layout/LayoutResolver.kt | 2 +- .../navigator/web/layout/ReadingOrder.kt | 23 +++++++++++++++++++ 8 files changed, 34 insertions(+), 60 deletions(-) delete mode 100644 readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfReadingOrder.kt delete mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/layout/FixedWebReadingOrder.kt create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt diff --git a/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt b/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt index 5605c7396c..cca12023df 100644 --- a/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt +++ b/readium/navigators/common/src/main/java/org/readium/navigator/common/Navigator.kt @@ -1,7 +1,6 @@ package org.readium.navigator.common import androidx.compose.runtime.State -import org.readium.r2.shared.DelicateReadiumApi import org.readium.r2.shared.ExperimentalReadiumApi import org.readium.r2.shared.publication.Link import org.readium.r2.shared.util.Url @@ -18,22 +17,6 @@ public interface Navigator { public suspend fun goTo(link: Link) } -@ExperimentalReadiumApi -public interface ReadingOrder { - - public val items: List - - public interface Item { - - public val href: Url - } - - @OptIn(DelicateReadiumApi::class) - public fun indexOfHref(href: Url): Int? = items - .indexOfFirst { it.href == href } - .takeUnless { it == -1 } -} - /** * Location of the navigator. */ diff --git a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfReadingOrder.kt b/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfReadingOrder.kt deleted file mode 100644 index c3cd681071..0000000000 --- a/readium/navigators/pdf/src/main/java/org/readium/navigator/pdf/PdfReadingOrder.kt +++ /dev/null @@ -1,15 +0,0 @@ -package org.readium.navigator.pdf - -import org.readium.navigator.common.ReadingOrder -import org.readium.r2.shared.ExperimentalReadiumApi -import org.readium.r2.shared.util.Url - -@ExperimentalReadiumApi -public data class PdfReadingOrder( - override val items: List -) : ReadingOrder - -@ExperimentalReadiumApi -public data class PdfReadingOrderItem( - override val href: Url -) : ReadingOrder.Item diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt index ca8dcd6d59..728419553b 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebNavigatorFactory.kt @@ -8,8 +8,8 @@ package org.readium.navigator.web import android.app.Application import java.io.IOException -import org.readium.navigator.web.layout.FixedWebReadingOrder -import org.readium.navigator.web.layout.FixedWebReadingOrderItem +import org.readium.navigator.web.layout.ReadingOrder +import org.readium.navigator.web.layout.ReadingOrderItem import org.readium.navigator.web.location.FixedWebGoLocation import org.readium.navigator.web.location.FixedWebLocatorAdapter import org.readium.navigator.web.location.HrefLocation @@ -76,7 +76,7 @@ public class FixedWebNavigatorFactory private constructor( readingOrder: List = publication.readingOrder ): Try { val items = readingOrder.map { - FixedWebReadingOrderItem( + ReadingOrderItem( href = it.url(), page = it.properties.page ) @@ -97,7 +97,7 @@ public class FixedWebNavigatorFactory private constructor( val state = FixedWebRenditionState( publicationMetadata = publication.metadata, - readingOrder = FixedWebReadingOrder(items), + readingOrder = ReadingOrder(items), initialPreferences = initialPreferences ?: FixedWebPreferences(), defaults = defaults, initialLocation = initialLocation ?: HrefLocation(items[0].href), diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRendition.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRendition.kt index 1d81d22a90..8d4ac0b9aa 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRendition.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRendition.kt @@ -23,7 +23,7 @@ import org.readium.navigator.common.TapContext import org.readium.navigator.common.defaultHyperlinkListener import org.readium.navigator.common.defaultInputListener import org.readium.navigator.web.layout.DoubleViewportSpread -import org.readium.navigator.web.layout.FixedWebReadingOrder +import org.readium.navigator.web.layout.ReadingOrder import org.readium.navigator.web.layout.SingleViewportSpread import org.readium.navigator.web.location.FixedWebLocation import org.readium.navigator.web.pager.NavigatorPager @@ -155,7 +155,7 @@ private fun LayoutDirection.toReadingProgression(): ReadingProgression = private fun onLinkActivated( url: Url, context: LinkContext?, - readingOrder: FixedWebReadingOrder, + readingOrder: ReadingOrder, listener: HyperlinkListener ) { readingOrder.indexOfHref(url.removeFragment()) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRenditionState.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRenditionState.kt index 8e6af24c9f..84684ea1a1 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRenditionState.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/FixedWebRenditionState.kt @@ -11,9 +11,9 @@ import org.readium.navigator.common.Navigator import org.readium.navigator.common.Overflow import org.readium.navigator.common.Overflowable import org.readium.navigator.common.RenditionState -import org.readium.navigator.web.layout.FixedWebReadingOrder import org.readium.navigator.web.layout.Layout import org.readium.navigator.web.layout.LayoutResolver +import org.readium.navigator.web.layout.ReadingOrder import org.readium.navigator.web.location.FixedWebGoLocation import org.readium.navigator.web.location.FixedWebLocation import org.readium.navigator.web.location.HrefLocation @@ -34,7 +34,7 @@ import org.readium.r2.shared.publication.Metadata @ExperimentalReadiumApi @Stable public class FixedWebRenditionState internal constructor( - public val readingOrder: FixedWebReadingOrder, + internal val readingOrder: ReadingOrder, publicationMetadata: Metadata, defaults: FixedWebDefaults, initialPreferences: FixedWebPreferences, @@ -115,7 +115,7 @@ internal data class FixedWebPreloadedData( @OptIn(ExperimentalReadiumApi::class) internal class LayoutDelegate( - readingOrder: FixedWebReadingOrder, + readingOrder: ReadingOrder, publicationMetadata: Metadata, defaults: FixedWebDefaults, initialPreferences: FixedWebPreferences @@ -145,7 +145,7 @@ internal class LayoutDelegate( @OptIn(ExperimentalReadiumApi::class, InternalReadiumApi::class) internal class NavigationDelegate( - private val readingOrder: FixedWebReadingOrder, + private val readingOrder: ReadingOrder, private val pagerState: PagerState, private val layout: State, private val settings: State, diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/FixedWebReadingOrder.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/FixedWebReadingOrder.kt deleted file mode 100644 index 584ed9a30c..0000000000 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/FixedWebReadingOrder.kt +++ /dev/null @@ -1,17 +0,0 @@ -package org.readium.navigator.web.layout - -import org.readium.navigator.common.ReadingOrder -import org.readium.r2.shared.ExperimentalReadiumApi -import org.readium.r2.shared.publication.presentation.Presentation -import org.readium.r2.shared.util.Url - -@ExperimentalReadiumApi -public data class FixedWebReadingOrder( - override val items: List -) : ReadingOrder - -@ExperimentalReadiumApi -public data class FixedWebReadingOrderItem( - override val href: Url, - val page: Presentation.Page? -) : ReadingOrder.Item diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt index 119d3a18aa..3e10e37f9a 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/LayoutResolver.kt @@ -7,7 +7,7 @@ import org.readium.r2.shared.publication.presentation.Presentation @OptIn(ExperimentalReadiumApi::class) internal class LayoutResolver( - private val readingOrder: FixedWebReadingOrder + private val readingOrder: ReadingOrder ) { fun layout(settings: FixedWebSettings): List = diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt new file mode 100644 index 0000000000..b10b8ceb91 --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/layout/ReadingOrder.kt @@ -0,0 +1,23 @@ +package org.readium.navigator.web.layout + +import org.readium.r2.shared.DelicateReadiumApi +import org.readium.r2.shared.ExperimentalReadiumApi +import org.readium.r2.shared.publication.presentation.Presentation +import org.readium.r2.shared.util.Url + +@ExperimentalReadiumApi +internal data class ReadingOrder( + val items: List +) { + + @OptIn(DelicateReadiumApi::class) + fun indexOfHref(href: Url): Int? = items + .indexOfFirst { it.href == href } + .takeUnless { it == -1 } +} + +@ExperimentalReadiumApi +internal data class ReadingOrderItem( + val href: Url, + val page: Presentation.Page? +) From f71e2d3ce21a012294017de3723d77e7d346d772 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Sat, 26 Oct 2024 14:41:22 +0200 Subject: [PATCH 59/61] Improve scroll algorithm to prevent users from being locked on one page. --- .../spread/SpreadNestedScrollConnection.kt | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadNestedScrollConnection.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadNestedScrollConnection.kt index a7bcf332c2..908e526cdb 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadNestedScrollConnection.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadNestedScrollConnection.kt @@ -5,6 +5,7 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.unit.Velocity import kotlin.math.abs +import org.readium.navigator.web.webview.RelaxedWebView import org.readium.navigator.web.webview.WebViewScrollable2DState internal class SpreadNestedScrollConnection( @@ -14,9 +15,14 @@ internal class SpreadNestedScrollConnection( override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { val webViewNow = webviewState.webView ?: return Offset.Zero + // For some reason, scrollX can vary by 1 or 2 pixels without any call to scrollTo. val webViewCannotScrollHorizontally = - (webViewNow.scrollX < 1 && available.x > 0) || - ((webViewNow.maxScrollX - webViewNow.scrollX) < 1 && available.x < 0) + (webViewNow.scrollX < 3 && available.x > 0) || + ((webViewNow.maxScrollX - webViewNow.scrollX) < 3 && available.x < 0) + + if (webViewCannotScrollHorizontally) { + snapWebview(webViewNow) + } val isGestureHorizontal = (abs(available.y) / abs(available.x)) < 0.58 // tan(Pi/6) @@ -32,13 +38,15 @@ internal class SpreadNestedScrollConnection( override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { val webViewNow = webviewState.webView ?: return Velocity.Zero + snapWebview(webViewNow) + return Velocity.Zero + } - if ((webViewNow.maxScrollX - webViewNow.scrollX) < 15) { - webViewNow.scrollTo(webViewNow.maxScrollX, webViewNow.scrollY) - } else if (webViewNow.scrollX in (0 until 15)) { - webViewNow.scrollTo(0, webViewNow.scrollY) + private fun snapWebview(webview: RelaxedWebView) { + if ((webview.maxScrollX - webview.scrollX) < 15) { + webview.scrollTo(webview.maxScrollX, webview.scrollY) + } else if (webview.scrollX in (0 until 15)) { + webview.scrollTo(0, webview.scrollY) } - - return Velocity.Zero } } From 93915760921cdda084be9f2e2ff26ea7f4771ef4 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Sat, 26 Oct 2024 15:42:31 +0200 Subject: [PATCH 60/61] Fix initialization callback --- .../web/scripts/dist/fixed-double-script.js | 2 +- .../scripts/dist/fixed-double-script.js.map | 2 +- .../web/scripts/dist/fixed-single-script.js | 2 +- .../scripts/dist/fixed-single-script.js.map | 2 +- .../src/bridge/fixed-initialization-bridge.ts | 3 ++ .../web/scripts/src/index-fixed-double.ts | 4 +++ .../web/scripts/src/index-fixed-single.ts | 4 +++ .../navigators/web/fixed-double-script.js | 2 +- .../navigators/web/fixed-double-script.js.map | 2 +- .../navigators/web/fixed-single-script.js | 2 +- .../navigators/web/fixed-single-script.js.map | 2 +- .../web/spread/DoubleViewportSpread.kt | 17 +++++----- .../web/spread/SingleViewportSpread.kt | 17 +++++----- .../navigator/web/spread/SpreadWebView.kt | 7 +++++ .../navigator/web/webapi/InitializationApi.kt | 18 +++++++++++ .../web/webview/ComposableWebView.kt | 31 ------------------- 16 files changed, 64 insertions(+), 53 deletions(-) create mode 100644 readium/navigators/web/scripts/src/bridge/fixed-initialization-bridge.ts create mode 100644 readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/InitializationApi.kt diff --git a/readium/navigators/web/scripts/dist/fixed-double-script.js b/readium/navigators/web/scripts/dist/fixed-double-script.js index 9bd7f2adc7..6b1ac6b812 100644 --- a/readium/navigators/web/scripts/dist/fixed-double-script.js +++ b/readium/navigators/web/scripts/dist/fixed-double-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e}setMessagePort(t){t.onmessage=t=>{this.onMessageFromIframe(t)}}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onMessageFromIframe(t){const e=t.data;switch(e.kind){case"contentSize":return this.onContentSizeAvailable(e.size);case"tap":return this.listener.onTap({x:e.x,y:e.y});case"linkActivated":return this.listener.onLinkActivated(e.href)}}onContentSizeAvailable(t){t&&(this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t,this.listener.onIframeLoaded())}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a,h){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},e.addEventListener("message",(t=>{t.ports[0]&&(t.source===s.contentWindow?this.leftPage.setMessagePort(t.ports[0]):t.source==n.contentWindow&&this.rightPage.setMessagePort(t.ports[0]))})),new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};h.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}},r={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=n.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,n,r),this.metaViewport=a}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,n=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:n},h={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,a,h);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(n).build(),this.leftPage.show(),this.rightPage.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page-left"),h=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,a,h){const o=new n(h);this.manager=new s(t,e,i,a,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,o,window.gestures)}(); +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e}setMessagePort(t){t.onmessage=t=>{this.onMessageFromIframe(t)}}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onMessageFromIframe(t){const e=t.data;switch(e.kind){case"contentSize":return this.onContentSizeAvailable(e.size);case"tap":return this.listener.onTap({x:e.x,y:e.y});case"linkActivated":return this.listener.onLinkActivated(e.href)}}onContentSizeAvailable(t){t&&(this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t,this.listener.onIframeLoaded())}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a,h){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},e.addEventListener("message",(t=>{t.ports[0]&&(t.source===s.contentWindow?this.leftPage.setMessagePort(t.ports[0]):t.source==n.contentWindow&&this.rightPage.setMessagePort(t.ports[0]))})),new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};h.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}},r={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=n.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,n,r),this.metaViewport=a}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,n=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:n},h={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,a,h);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(n).build(),this.leftPage.show(),this.rightPage.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page-left"),h=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,a,h){const o=new n(h);this.manager=new s(t,e,i,a,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,o,window.gestures),window.initialization.onScriptsLoaded()}(); //# sourceMappingURL=fixed-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-double-script.js.map b/readium/navigators/web/scripts/dist/fixed-double-script.js.map index a79f0cc918..dc50214d91 100644 --- a/readium/navigators/web/scripts/dist/fixed-double-script.js.map +++ b/readium/navigators/web/scripts/dist/fixed-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n }\n setMessagePort(messagePort) {\n messagePort.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onMessageFromIframe(event) {\n const message = event.data;\n switch (message.kind) {\n case \"contentSize\":\n return this.onContentSizeAvailable(message.size);\n case \"tap\":\n return this.listener.onTap({ x: message.x, y: message.y });\n case \"linkActivated\":\n return this.listener.onLinkActivated(message.href);\n }\n }\n onContentSizeAvailable(size) {\n if (!size) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n this.listener.onIframeLoaded();\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\nexport function parseViewportString(viewportString) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportString))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n window.addEventListener(\"message\", (event) => {\n if (!event.ports[0]) {\n return;\n }\n if (event.source === leftIframe.contentWindow) {\n this.leftPage.setMessagePort(event.ports[0]);\n }\n else if (event.source == rightIframe.contentWindow) {\n this.rightPage.setMessagePort(event.ports[0]);\n }\n });\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const leftPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = leftIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n const rightPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = rightIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, leftPageListener);\n this.rightPage = new PageManager(window, rightIframe, rightPageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","setMessagePort","messagePort","onmessage","message","onMessageFromIframe","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","event","data","kind","onContentSizeAvailable","onTap","x","y","onLinkActivated","href","onIframeLoaded","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","document","addEventListener","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","ports","source","leftPage","rightPage","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","leftPageListener","layout","boundingRect","getBoundingClientRect","rightPageListener","loadSpread","spread","setViewport","viewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","content","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","querySelector","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n }\n setMessagePort(messagePort) {\n messagePort.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onMessageFromIframe(event) {\n const message = event.data;\n switch (message.kind) {\n case \"contentSize\":\n return this.onContentSizeAvailable(message.size);\n case \"tap\":\n return this.listener.onTap({ x: message.x, y: message.y });\n case \"linkActivated\":\n return this.listener.onLinkActivated(message.href);\n }\n }\n onContentSizeAvailable(size) {\n if (!size) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n this.listener.onIframeLoaded();\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\nexport function parseViewportString(viewportString) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportString))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n window.addEventListener(\"message\", (event) => {\n if (!event.ports[0]) {\n return;\n }\n if (event.source === leftIframe.contentWindow) {\n this.leftPage.setMessagePort(event.ports[0]);\n }\n else if (event.source == rightIframe.contentWindow) {\n this.rightPage.setMessagePort(event.ports[0]);\n }\n });\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const leftPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = leftIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n const rightPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = rightIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, leftPageListener);\n this.rightPage = new PageManager(window, rightIframe, rightPageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\nwindow.initialization.onScriptsLoaded();\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","setMessagePort","messagePort","onmessage","message","onMessageFromIframe","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","event","data","kind","onContentSizeAvailable","onTap","x","y","onLinkActivated","href","onIframeLoaded","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","document","addEventListener","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","ports","source","leftPage","rightPage","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","leftPageListener","layout","boundingRect","getBoundingClientRect","rightPageListener","loadSpread","spread","setViewport","viewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","content","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","querySelector","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","initialization","onScriptsLoaded"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-single-script.js b/readium/navigators/web/scripts/dist/fixed-single-script.js index 123e469a47..d5ed6229a4 100644 --- a/readium/navigators/web/scripts/dist/fixed-single-script.js +++ b/readium/navigators/web/scripts/dist/fixed-single-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e}setMessagePort(t){t.onmessage=t=>{this.onMessageFromIframe(t)}}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onMessageFromIframe(t){const e=t.data;switch(e.kind){case"contentSize":return this.onContentSizeAvailable(e.size);case"tap":return this.listener.onTap({x:e.x,y:e.y});case"linkActivated":return this.listener.onLinkActivated(e.href)}}onContentSizeAvailable(t){t&&(this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t,this.listener.onIframeLoaded())}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,e.addEventListener("message",(t=>{t.source===s.contentWindow&&t.ports[0]&&this.page.setMessagePort(t.ports[0])})),new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};a.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}}),this.metaViewport=n;const h={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};a.onTap(i)},onLinkActivated:t=>{a.onLinkActivated(t)}};this.page=new t(e,s,h)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page"),h=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,a){const h=new n(a);this.manager=new s(t,e,i,h)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,window.gestures)}(); +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e}setMessagePort(t){t.onmessage=t=>{this.onMessageFromIframe(t)}}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onMessageFromIframe(t){const e=t.data;switch(e.kind){case"contentSize":return this.onContentSizeAvailable(e.size);case"tap":return this.listener.onTap({x:e.x,y:e.y});case"linkActivated":return this.listener.onLinkActivated(e.href)}}onContentSizeAvailable(t){t&&(this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t,this.listener.onIframeLoaded())}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,e.addEventListener("message",(t=>{t.source===s.contentWindow&&t.ports[0]&&this.page.setMessagePort(t.ports[0])})),new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};a.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}}),this.metaViewport=n;const h={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};a.onTap(i)},onLinkActivated:t=>{a.onLinkActivated(t)}};this.page=new t(e,s,h)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page"),h=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,a){const h=new n(a);this.manager=new s(t,e,i,h)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,window.gestures),window.initialization.onScriptsLoaded()}(); //# sourceMappingURL=fixed-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/scripts/dist/fixed-single-script.js.map b/readium/navigators/web/scripts/dist/fixed-single-script.js.map index 92eafc1dc0..a823bae92d 100644 --- a/readium/navigators/web/scripts/dist/fixed-single-script.js.map +++ b/readium/navigators/web/scripts/dist/fixed-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n }\n setMessagePort(messagePort) {\n messagePort.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onMessageFromIframe(event) {\n const message = event.data;\n switch (message.kind) {\n case \"contentSize\":\n return this.onContentSizeAvailable(message.size);\n case \"tap\":\n return this.listener.onTap({ x: message.x, y: message.y });\n case \"linkActivated\":\n return this.listener.onLinkActivated(message.href);\n }\n }\n onContentSizeAvailable(size) {\n if (!size) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n this.listener.onIframeLoaded();\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\nexport function parseViewportString(viewportString) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportString))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n window.addEventListener(\"message\", (event) => {\n if (event.source === iframe.contentWindow && event.ports[0]) {\n this.page.setMessagePort(event.ports[0]);\n }\n });\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n const boundingRect = iframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","setMessagePort","messagePort","onmessage","message","onMessageFromIframe","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","event","data","kind","onContentSizeAvailable","onTap","x","y","onLinkActivated","href","onIframeLoaded","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","document","addEventListener","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","SingleAreaManager","metaViewport","fit","insets","source","ports","page","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","pageListener","boundingRect","getBoundingClientRect","setViewport","viewport","layout","setFit","loadResource","safeDrawingSize","content","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","querySelector","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n }\n setMessagePort(messagePort) {\n messagePort.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onMessageFromIframe(event) {\n const message = event.data;\n switch (message.kind) {\n case \"contentSize\":\n return this.onContentSizeAvailable(message.size);\n case \"tap\":\n return this.listener.onTap({ x: message.x, y: message.y });\n case \"linkActivated\":\n return this.listener.onLinkActivated(message.href);\n }\n }\n onContentSizeAvailable(size) {\n if (!size) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n this.listener.onIframeLoaded();\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\nexport function parseViewportString(viewportString) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportString))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n window.addEventListener(\"message\", (event) => {\n if (event.source === iframe.contentWindow && event.ports[0]) {\n this.page.setMessagePort(event.ports[0]);\n }\n });\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n const boundingRect = iframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\nwindow.initialization.onScriptsLoaded();\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","setMessagePort","messagePort","onmessage","message","onMessageFromIframe","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","event","data","kind","onContentSizeAvailable","onTap","x","y","onLinkActivated","href","onIframeLoaded","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","document","addEventListener","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","SingleAreaManager","metaViewport","fit","insets","source","ports","page","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","pageListener","boundingRect","getBoundingClientRect","setViewport","viewport","layout","setFit","loadResource","safeDrawingSize","content","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","querySelector","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","initialization","onScriptsLoaded"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/scripts/src/bridge/fixed-initialization-bridge.ts b/readium/navigators/web/scripts/src/bridge/fixed-initialization-bridge.ts new file mode 100644 index 0000000000..059196892f --- /dev/null +++ b/readium/navigators/web/scripts/src/bridge/fixed-initialization-bridge.ts @@ -0,0 +1,3 @@ +export interface InitializationBridge { + onScriptsLoaded: () => void +} diff --git a/readium/navigators/web/scripts/src/index-fixed-double.ts b/readium/navigators/web/scripts/src/index-fixed-double.ts index e7c8819a13..e8f9e61b6f 100644 --- a/readium/navigators/web/scripts/src/index-fixed-double.ts +++ b/readium/navigators/web/scripts/src/index-fixed-double.ts @@ -10,9 +10,11 @@ import { GesturesBridge } from "./bridge/fixed-gestures-bridge" import { FixedDoubleBridge } from "./bridge/fixed-double-bridge" +import { InitializationBridge } from "./bridge/fixed-initialization-bridge" declare global { interface Window { + initialization: InitializationBridge doubleArea: FixedDoubleBridge gestures: GesturesBridge } @@ -33,3 +35,5 @@ Window.prototype.doubleArea = new FixedDoubleBridge( metaViewport, window.gestures ) + +window.initialization.onScriptsLoaded() diff --git a/readium/navigators/web/scripts/src/index-fixed-single.ts b/readium/navigators/web/scripts/src/index-fixed-single.ts index f5041fc5d1..4901130417 100644 --- a/readium/navigators/web/scripts/src/index-fixed-single.ts +++ b/readium/navigators/web/scripts/src/index-fixed-single.ts @@ -9,10 +9,12 @@ */ import { GesturesBridge } from "./bridge/fixed-gestures-bridge" +import { InitializationBridge } from "./bridge/fixed-initialization-bridge" import { FixedSingleBridge } from "./bridge/fixed-single-bridge" declare global { interface Window { + initialization: InitializationBridge singleArea: FixedSingleBridge gestures: GesturesBridge } @@ -30,3 +32,5 @@ window.singleArea = new FixedSingleBridge( metaViewport, window.gestures ) + +window.initialization.onScriptsLoaded() diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js index 9bd7f2adc7..6b1ac6b812 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e}setMessagePort(t){t.onmessage=t=>{this.onMessageFromIframe(t)}}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onMessageFromIframe(t){const e=t.data;switch(e.kind){case"contentSize":return this.onContentSizeAvailable(e.size);case"tap":return this.listener.onTap({x:e.x,y:e.y});case"linkActivated":return this.listener.onLinkActivated(e.href)}}onContentSizeAvailable(t){t&&(this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t,this.listener.onIframeLoaded())}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a,h){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},e.addEventListener("message",(t=>{t.ports[0]&&(t.source===s.contentWindow?this.leftPage.setMessagePort(t.ports[0]):t.source==n.contentWindow&&this.rightPage.setMessagePort(t.ports[0]))})),new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};h.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}},r={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=n.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,n,r),this.metaViewport=a}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,n=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:n},h={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,a,h);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(n).build(),this.leftPage.show(),this.rightPage.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page-left"),h=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,a,h){const o=new n(h);this.manager=new s(t,e,i,a,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,o,window.gestures)}(); +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e}setMessagePort(t){t.onmessage=t=>{this.onMessageFromIframe(t)}}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onMessageFromIframe(t){const e=t.data;switch(e.kind){case"contentSize":return this.onContentSizeAvailable(e.size);case"tap":return this.listener.onTap({x:e.x,y:e.y});case"linkActivated":return this.listener.onLinkActivated(e.href)}}onContentSizeAvailable(t){t&&(this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t,this.listener.onIframeLoaded())}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a,h){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},e.addEventListener("message",(t=>{t.ports[0]&&(t.source===s.contentWindow?this.leftPage.setMessagePort(t.ports[0]):t.source==n.contentWindow&&this.rightPage.setMessagePort(t.ports[0]))})),new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};h.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}});const o={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}},r={onIframeLoaded:()=>{this.layout()},onTap:t=>{const e=n.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};h.onTap(i)},onLinkActivated:t=>{h.onLinkActivated(t)}};this.leftPage=new t(e,s,o),this.rightPage=new t(e,n,r),this.metaViewport=a}loadSpread(t){this.leftPage.hide(),this.rightPage.hide(),this.spread=t,t.left&&this.leftPage.loadPage(t.left),t.right&&this.rightPage.loadPage(t.right)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}layout(){if(!this.viewport||!this.leftPage.size&&this.spread.left||!this.rightPage.size&&this.spread.right)return;const t={top:this.insets.top,right:0,bottom:this.insets.bottom,left:this.insets.left};this.leftPage.setMargins(t);const i={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:0};this.rightPage.setMargins(i),this.spread.right?this.spread.left||this.leftPage.setPlaceholder(this.rightPage.size):this.rightPage.setPlaceholder(this.leftPage.size);const s=this.leftPage.size.width+this.rightPage.size.width,n=Math.max(this.leftPage.size.height,this.rightPage.size.height),a={width:s,height:n},h={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},o=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,a,h);this.metaViewport.content=(new e).setInitialScale(o).setMinimumScale(o).setWidth(s).setHeight(n).build(),this.leftPage.show(),this.rightPage.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page-left"),h=document.getElementById("page-right"),o=document.querySelector("meta[name=viewport]");Window.prototype.doubleArea=new class{constructor(t,e,i,a,h){const o=new n(h);this.manager=new s(t,e,i,a,o)}loadSpread(t){this.manager.loadSpread(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,o,window.gestures),window.initialization.onScriptsLoaded()}(); //# sourceMappingURL=fixed-double-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map index a79f0cc918..dc50214d91 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-double-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-double-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n }\n setMessagePort(messagePort) {\n messagePort.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onMessageFromIframe(event) {\n const message = event.data;\n switch (message.kind) {\n case \"contentSize\":\n return this.onContentSizeAvailable(message.size);\n case \"tap\":\n return this.listener.onTap({ x: message.x, y: message.y });\n case \"linkActivated\":\n return this.listener.onLinkActivated(message.href);\n }\n }\n onContentSizeAvailable(size) {\n if (!size) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n this.listener.onIframeLoaded();\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\nexport function parseViewportString(viewportString) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportString))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n window.addEventListener(\"message\", (event) => {\n if (!event.ports[0]) {\n return;\n }\n if (event.source === leftIframe.contentWindow) {\n this.leftPage.setMessagePort(event.ports[0]);\n }\n else if (event.source == rightIframe.contentWindow) {\n this.rightPage.setMessagePort(event.ports[0]);\n }\n });\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const leftPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = leftIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n const rightPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = rightIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, leftPageListener);\n this.rightPage = new PageManager(window, rightIframe, rightPageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","setMessagePort","messagePort","onmessage","message","onMessageFromIframe","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","event","data","kind","onContentSizeAvailable","onTap","x","y","onLinkActivated","href","onIframeLoaded","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","document","addEventListener","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","ports","source","leftPage","rightPage","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","leftPageListener","layout","boundingRect","getBoundingClientRect","rightPageListener","loadSpread","spread","setViewport","viewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","content","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","querySelector","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-double-script.js","mappings":"yBACO,MAAMA,EACT,WAAAC,CAAYC,EAAQC,EAAQC,GAExB,GADAC,KAAKC,QAAU,CAAEC,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,IAC/CP,EAAOQ,cACR,MAAMC,MAAM,mDAEhBP,KAAKD,SAAWA,EAChBC,KAAKF,OAASA,CAClB,CACA,cAAAU,CAAeC,GACXA,EAAYC,UAAaC,IACrBX,KAAKY,oBAAoBD,EAAQ,CAEzC,CACA,IAAAE,GACIb,KAAKF,OAAOgB,MAAMC,QAAU,OAChC,CACA,IAAAC,GACIhB,KAAKF,OAAOgB,MAAMC,QAAU,MAChC,CAEA,UAAAE,CAAWhB,GACHD,KAAKC,SAAWA,IAGpBD,KAAKF,OAAOgB,MAAMI,UAAYlB,KAAKC,QAAQC,IAAM,KACjDF,KAAKF,OAAOgB,MAAMK,WAAanB,KAAKC,QAAQI,KAAO,KACnDL,KAAKF,OAAOgB,MAAMM,aAAepB,KAAKC,QAAQG,OAAS,KACvDJ,KAAKF,OAAOgB,MAAMO,YAAcrB,KAAKC,QAAQE,MAAQ,KACzD,CAEA,QAAAmB,CAASC,GACLvB,KAAKF,OAAO0B,IAAMD,CACtB,CAEA,cAAAE,CAAeC,GACX1B,KAAKF,OAAOgB,MAAMa,WAAa,SAC/B3B,KAAKF,OAAOgB,MAAMc,MAAQF,EAAKE,MAAQ,KACvC5B,KAAKF,OAAOgB,MAAMe,OAASH,EAAKG,OAAS,KACzC7B,KAAK0B,KAAOA,CAChB,CACA,mBAAAd,CAAoBkB,GAChB,MAAMnB,EAAUmB,EAAMC,KACtB,OAAQpB,EAAQqB,MACZ,IAAK,cACD,OAAOhC,KAAKiC,uBAAuBtB,EAAQe,MAC/C,IAAK,MACD,OAAO1B,KAAKD,SAASmC,MAAM,CAAEC,EAAGxB,EAAQwB,EAAGC,EAAGzB,EAAQyB,IAC1D,IAAK,gBACD,OAAOpC,KAAKD,SAASsC,gBAAgB1B,EAAQ2B,MAEzD,CACA,sBAAAL,CAAuBP,GACdA,IAIL1B,KAAKF,OAAOgB,MAAMc,MAAQF,EAAKE,MAAQ,KACvC5B,KAAKF,OAAOgB,MAAMe,OAASH,EAAKG,OAAS,KACzC7B,KAAK0B,KAAOA,EACZ1B,KAAKD,SAASwC,iBAClB,EC9DG,MAAMC,EACT,eAAAC,CAAgBC,GAEZ,OADA1C,KAAK2C,aAAeD,EACb1C,IACX,CACA,eAAA4C,CAAgBF,GAEZ,OADA1C,KAAK6C,aAAeH,EACb1C,IACX,CACA,QAAA8C,CAASlB,GAEL,OADA5B,KAAK4B,MAAQA,EACN5B,IACX,CACA,SAAA+C,CAAUlB,GAEN,OADA7B,KAAK6B,OAASA,EACP7B,IACX,CACA,KAAAgD,GACI,MAAMC,EAAa,GAanB,OAZIjD,KAAK2C,cACLM,EAAWC,KAAK,iBAAmBlD,KAAK2C,cAExC3C,KAAK6C,cACLI,EAAWC,KAAK,iBAAmBlD,KAAK6C,cAExC7C,KAAK4B,OACLqB,EAAWC,KAAK,SAAWlD,KAAK4B,OAEhC5B,KAAK6B,QACLoB,EAAWC,KAAK,UAAYlD,KAAK6B,QAE9BoB,EAAWE,KAAK,KAC3B,EChCG,MAAMC,EACT,WAAAxD,CAAYC,EAAQE,GAChBC,KAAKH,OAASA,EACdG,KAAKD,SAAWA,EAChBsD,SAASC,iBAAiB,SAAUxB,IAChC9B,KAAKuD,QAAQzB,EAAM,IACpB,EACP,CACA,OAAAyB,CAAQzB,GACJ,GAAIA,EAAM0B,iBACN,OAEJ,MAAMC,EAAYzD,KAAKH,OAAO6D,eAC9B,GAAID,GAA+B,SAAlBA,EAAUE,KAIvB,OAEJ,IAAIC,EAEAA,EADA9B,EAAM+B,kBAAkBC,YACP9D,KAAK+D,0BAA0BjC,EAAM+B,QAGrC,KAEjBD,EACIA,aAA0BI,mBAC1BhE,KAAKD,SAASsC,gBAAgBuB,EAAetB,MAIjDtC,KAAKD,SAASmC,MAAMJ,GAExBA,EAAMmC,kBACNnC,EAAMoC,gBACV,CAEA,yBAAAH,CAA0BI,GACtB,OAAe,MAAXA,EACO,MAgBqD,GAdxC,CACpB,IACA,QACA,SACA,SACA,UACA,QACA,QACA,SACA,SACA,SACA,WACA,SAEgBC,QAAQD,EAAQE,SAASC,gBAIzCH,EAAQI,aAAa,oBACoC,SAAzDJ,EAAQK,aAAa,mBAAmBF,cAJjCH,EAQPA,EAAQM,cACDzE,KAAK+D,0BAA0BI,EAAQM,eAE3C,IACX,ECjEG,MAAMC,EACT,WAAA9E,CAAYC,EAAQ8E,EAAYC,EAAaC,EAAc9E,GACvDC,KAAK8E,IAAM,UACX9E,KAAK+E,OAAS,CAAE7E,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GACnDR,EAAOyD,iBAAiB,WAAYxB,IAC3BA,EAAMkD,MAAM,KAGblD,EAAMmD,SAAWN,EAAWrE,cAC5BN,KAAKkF,SAAS1E,eAAesB,EAAMkD,MAAM,IAEpClD,EAAMmD,QAAUL,EAAYtE,eACjCN,KAAKmF,UAAU3E,eAAesB,EAAMkD,MAAM,IAC9C,IAgBJ,IAAI5B,EAAiBvD,EAdW,CAC5BqC,MAAQJ,IACJ,MAAMsD,EAAW,CACbjD,GAAIL,EAAMuD,QAAUC,eAAeC,YAC/BD,eAAe5C,MACnBN,GAAIN,EAAM0D,QAAUF,eAAeG,WAAaH,eAAe5C,OAEnE3C,EAASmC,MAAMkD,EAAS,EAG5B/C,gBAAkBqD,IACd,MAAMnF,MAAM,+CAA+C,IAInE,MAAMoF,EAAmB,CACrBpD,eAAgB,KACZvC,KAAK4F,QAAQ,EAEjB1D,MAAQJ,IACJ,MAAM+D,EAAelB,EAAWmB,wBAC1BV,EAAW,CACbjD,GAAIL,EAAMK,EAAI0D,EAAaxF,KAAOiF,eAAeC,YAC7CD,eAAe5C,MACnBN,GAAIN,EAAMM,EAAIyD,EAAa3F,IAAMoF,eAAeG,WAC5CH,eAAe5C,OAEvB3C,EAASmC,MAAMkD,EAAS,EAE5B/C,gBAAkBC,IACdvC,EAASsC,gBAAgBC,EAAK,GAGhCyD,EAAoB,CACtBxD,eAAgB,KACZvC,KAAK4F,QAAQ,EAEjB1D,MAAQJ,IACJ,MAAM+D,EAAejB,EAAYkB,wBAC3BV,EAAW,CACbjD,GAAIL,EAAMK,EAAI0D,EAAaxF,KAAOiF,eAAeC,YAC7CD,eAAe5C,MACnBN,GAAIN,EAAMM,EAAIyD,EAAa3F,IAAMoF,eAAeG,WAC5CH,eAAe5C,OAEvB3C,EAASmC,MAAMkD,EAAS,EAE5B/C,gBAAkBC,IACdvC,EAASsC,gBAAgBC,EAAK,GAGtCtC,KAAKkF,SAAW,IAAIvF,EAAYE,EAAQ8E,EAAYgB,GACpD3F,KAAKmF,UAAY,IAAIxF,EAAYE,EAAQ+E,EAAamB,GACtD/F,KAAK6E,aAAeA,CACxB,CACA,UAAAmB,CAAWC,GACPjG,KAAKkF,SAASlE,OACdhB,KAAKmF,UAAUnE,OACfhB,KAAKiG,OAASA,EACVA,EAAO5F,MACPL,KAAKkF,SAAS5D,SAAS2E,EAAO5F,MAE9B4F,EAAO9F,OACPH,KAAKmF,UAAU7D,SAAS2E,EAAO9F,MAEvC,CACA,WAAA+F,CAAYxE,EAAMqD,GACV/E,KAAKmG,UAAYzE,GAAQ1B,KAAK+E,QAAUA,IAG5C/E,KAAKmG,SAAWzE,EAChB1B,KAAK+E,OAASA,EACd/E,KAAK4F,SACT,CACA,MAAAQ,CAAOtB,GACC9E,KAAK8E,KAAOA,IAGhB9E,KAAK8E,IAAMA,EACX9E,KAAK4F,SACT,CACA,MAAAA,GACI,IAAK5F,KAAKmG,WACJnG,KAAKkF,SAASxD,MAAQ1B,KAAKiG,OAAO5F,OAClCL,KAAKmF,UAAUzD,MAAQ1B,KAAKiG,OAAO9F,MACrC,OAEJ,MAAMkG,EAAc,CAChBnG,IAAKF,KAAK+E,OAAO7E,IACjBC,MAAO,EACPC,OAAQJ,KAAK+E,OAAO3E,OACpBC,KAAML,KAAK+E,OAAO1E,MAEtBL,KAAKkF,SAASjE,WAAWoF,GACzB,MAAMC,EAAe,CACjBpG,IAAKF,KAAK+E,OAAO7E,IACjBC,MAAOH,KAAK+E,OAAO5E,MACnBC,OAAQJ,KAAK+E,OAAO3E,OACpBC,KAAM,GAEVL,KAAKmF,UAAUlE,WAAWqF,GACrBtG,KAAKiG,OAAO9F,MAGPH,KAAKiG,OAAO5F,MAClBL,KAAKkF,SAASzD,eAAezB,KAAKmF,UAAUzD,MAH5C1B,KAAKmF,UAAU1D,eAAezB,KAAKkF,SAASxD,MAKhD,MAAM6E,EAAevG,KAAKkF,SAASxD,KAAKE,MAAQ5B,KAAKmF,UAAUzD,KAAKE,MAC9D4E,EAAgBC,KAAKC,IAAI1G,KAAKkF,SAASxD,KAAKG,OAAQ7B,KAAKmF,UAAUzD,KAAKG,QACxE8E,EAAc,CAAE/E,MAAO2E,EAAc1E,OAAQ2E,GAC7CI,EAAkB,CACpBhF,MAAO5B,KAAKmG,SAASvE,MAAQ5B,KAAK+E,OAAO1E,KAAOL,KAAK+E,OAAO5E,MAC5D0B,OAAQ7B,KAAKmG,SAAStE,OAAS7B,KAAK+E,OAAO7E,IAAMF,KAAK+E,OAAO3E,QAE3DsC,ECrIP,SAAsBoC,EAAK+B,EAASC,GACvC,OAAQhC,GACJ,IAAK,UACD,OAOZ,SAAoB+B,EAASC,GACzB,MAAMC,EAAaD,EAAUlF,MAAQiF,EAAQjF,MACvCoF,EAAcF,EAAUjF,OAASgF,EAAQhF,OAC/C,OAAO4E,KAAKQ,IAAIF,EAAYC,EAChC,CAXmBE,CAAWL,EAASC,GAC/B,IAAK,QACD,OAUZ,SAAkBD,EAASC,GACvB,OAAOA,EAAUlF,MAAQiF,EAAQjF,KACrC,CAZmBuF,CAASN,EAASC,GAC7B,IAAK,SACD,OAWZ,SAAmBD,EAASC,GACxB,OAAOA,EAAUjF,OAASgF,EAAQhF,MACtC,CAbmBuF,CAAUP,EAASC,GAEtC,CD4HsBO,CAAarH,KAAK8E,IAAK6B,EAAaC,GAClD5G,KAAK6E,aAAagC,SAAU,IAAIrE,GAC3BC,gBAAgBC,GAChBE,gBAAgBF,GAChBI,SAASyD,GACTxD,UAAUyD,GACVxD,QACLhD,KAAKkF,SAASrE,OACdb,KAAKmF,UAAUtE,MACnB,EE9IG,MAAMyG,EACT,WAAA1H,CAAY2H,GACRvH,KAAKwH,UAAYD,CACrB,CACA,KAAArF,CAAMJ,GACF9B,KAAKwH,UAAUtF,MAAMuF,KAAKC,UAAU5F,GACxC,CACA,eAAAO,CAAgBC,GACZtC,KAAKwH,UAAUnF,gBAAgBC,EACnC,ECHJ,MAAMqC,EAAatB,SAASsE,eAAe,aACrC/C,EAAcvB,SAASsE,eAAe,cACtC9C,EAAexB,SAASuE,cAAc,uBAC5CC,OAAOC,UAAUC,WAAa,ICPvB,MACH,WAAAnI,CAAYC,EAAQ8E,EAAYC,EAAaC,EAAcmD,GACvD,MAAMjI,EAAW,IAAIuH,EAAsBU,GAC3ChI,KAAKiI,QAAU,IAAIvD,EAAkB7E,EAAQ8E,EAAYC,EAAaC,EAAc9E,EACxF,CACA,UAAAiG,CAAWC,GACPjG,KAAKiI,QAAQjC,WAAWC,EAC5B,CACA,WAAAC,CAAYgC,EAAgBC,EAAgBC,EAAUC,EAAYC,EAAaC,GAC3E,MAAMpC,EAAW,CAAEvE,MAAOsG,EAAgBrG,OAAQsG,GAC5CpD,EAAS,CACX7E,IAAKkI,EACL/H,KAAMkI,EACNnI,OAAQkI,EACRnI,MAAOkI,GAEXrI,KAAKiI,QAAQ/B,YAAYC,EAAUpB,EACvC,CACA,MAAAqB,CAAOtB,GACH,GAAW,WAAPA,GAA2B,SAAPA,GAAyB,UAAPA,EACtC,MAAMvE,MAAM,sBAAsBuE,KAEtC9E,KAAKiI,QAAQ7B,OAAOtB,EACxB,GDhBgDjF,OAAQ8E,EAAYC,EAAaC,EAAchF,OAAOmI,UAC1GnI,OAAO2I,eAAeC,iB","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/double-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-double.ts","webpack://readium-js/./src/bridge/fixed-double-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n }\n setMessagePort(messagePort) {\n messagePort.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onMessageFromIframe(event) {\n const message = event.data;\n switch (message.kind) {\n case \"contentSize\":\n return this.onContentSizeAvailable(message.size);\n case \"tap\":\n return this.listener.onTap({ x: message.x, y: message.y });\n case \"linkActivated\":\n return this.listener.onLinkActivated(message.href);\n }\n }\n onContentSizeAvailable(size) {\n if (!size) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n this.listener.onIframeLoaded();\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\nexport function parseViewportString(viewportString) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportString))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class DoubleAreaManager {\n constructor(window, leftIframe, rightIframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n window.addEventListener(\"message\", (event) => {\n if (!event.ports[0]) {\n return;\n }\n if (event.source === leftIframe.contentWindow) {\n this.leftPage.setMessagePort(event.ports[0]);\n }\n else if (event.source == rightIframe.contentWindow) {\n this.rightPage.setMessagePort(event.ports[0]);\n }\n });\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n const leftPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = leftIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n const rightPageListener = {\n onIframeLoaded: () => {\n this.layout();\n },\n onTap: (event) => {\n const boundingRect = rightIframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.leftPage = new PageManager(window, leftIframe, leftPageListener);\n this.rightPage = new PageManager(window, rightIframe, rightPageListener);\n this.metaViewport = metaViewport;\n }\n loadSpread(spread) {\n this.leftPage.hide();\n this.rightPage.hide();\n this.spread = spread;\n if (spread.left) {\n this.leftPage.loadPage(spread.left);\n }\n if (spread.right) {\n this.rightPage.loadPage(spread.right);\n }\n }\n setViewport(size, insets) {\n if (this.viewport == size && this.insets == insets) {\n return;\n }\n this.viewport = size;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n layout() {\n if (!this.viewport ||\n (!this.leftPage.size && this.spread.left) ||\n (!this.rightPage.size && this.spread.right)) {\n return;\n }\n const leftMargins = {\n top: this.insets.top,\n right: 0,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.leftPage.setMargins(leftMargins);\n const rightMargins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: 0,\n };\n this.rightPage.setMargins(rightMargins);\n if (!this.spread.right) {\n this.rightPage.setPlaceholder(this.leftPage.size);\n }\n else if (!this.spread.left) {\n this.leftPage.setPlaceholder(this.rightPage.size);\n }\n const contentWidth = this.leftPage.size.width + this.rightPage.size.width;\n const contentHeight = Math.max(this.leftPage.size.height, this.rightPage.size.height);\n const contentSize = { width: contentWidth, height: contentHeight };\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, contentSize, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(contentWidth)\n .setHeight(contentHeight)\n .build();\n this.leftPage.show();\n this.rightPage.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedDoubleBridge } from \"./bridge/fixed-double-bridge\";\nconst leftIframe = document.getElementById(\"page-left\");\nconst rightIframe = document.getElementById(\"page-right\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nWindow.prototype.doubleArea = new FixedDoubleBridge(window, leftIframe, rightIframe, metaViewport, window.gestures);\nwindow.initialization.onScriptsLoaded();\n","import { DoubleAreaManager } from \"../fixed/double-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedDoubleBridge {\n constructor(window, leftIframe, rightIframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new DoubleAreaManager(window, leftIframe, rightIframe, metaViewport, listener);\n }\n loadSpread(spread) {\n this.manager.loadSpread(spread);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","setMessagePort","messagePort","onmessage","message","onMessageFromIframe","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","event","data","kind","onContentSizeAvailable","onTap","x","y","onLinkActivated","href","onIframeLoaded","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","document","addEventListener","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","DoubleAreaManager","leftIframe","rightIframe","metaViewport","fit","insets","ports","source","leftPage","rightPage","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","leftPageListener","layout","boundingRect","getBoundingClientRect","rightPageListener","loadSpread","spread","setViewport","viewport","setFit","leftMargins","rightMargins","contentWidth","contentHeight","Math","max","contentSize","safeDrawingSize","content","container","widthRatio","heightRatio","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","querySelector","Window","prototype","doubleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","initialization","onScriptsLoaded"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js index 123e469a47..d5ed6229a4 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js @@ -1,2 +1,2 @@ -!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e}setMessagePort(t){t.onmessage=t=>{this.onMessageFromIframe(t)}}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onMessageFromIframe(t){const e=t.data;switch(e.kind){case"contentSize":return this.onContentSizeAvailable(e.size);case"tap":return this.listener.onTap({x:e.x,y:e.y});case"linkActivated":return this.listener.onLinkActivated(e.href)}}onContentSizeAvailable(t){t&&(this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t,this.listener.onIframeLoaded())}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,e.addEventListener("message",(t=>{t.source===s.contentWindow&&t.ports[0]&&this.page.setMessagePort(t.ports[0])})),new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};a.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}}),this.metaViewport=n;const h={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};a.onTap(i)},onLinkActivated:t=>{a.onLinkActivated(t)}};this.page=new t(e,s,h)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page"),h=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,a){const h=new n(a);this.manager=new s(t,e,i,h)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,window.gestures)}(); +!function(){"use strict";class t{constructor(t,e,i){if(this.margins={top:0,right:0,bottom:0,left:0},!e.contentWindow)throw Error("Iframe argument must have been attached to DOM.");this.listener=i,this.iframe=e}setMessagePort(t){t.onmessage=t=>{this.onMessageFromIframe(t)}}show(){this.iframe.style.display="unset"}hide(){this.iframe.style.display="none"}setMargins(t){this.margins!=t&&(this.iframe.style.marginTop=this.margins.top+"px",this.iframe.style.marginLeft=this.margins.left+"px",this.iframe.style.marginBottom=this.margins.bottom+"px",this.iframe.style.marginRight=this.margins.right+"px")}loadPage(t){this.iframe.src=t}setPlaceholder(t){this.iframe.style.visibility="hidden",this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t}onMessageFromIframe(t){const e=t.data;switch(e.kind){case"contentSize":return this.onContentSizeAvailable(e.size);case"tap":return this.listener.onTap({x:e.x,y:e.y});case"linkActivated":return this.listener.onLinkActivated(e.href)}}onContentSizeAvailable(t){t&&(this.iframe.style.width=t.width+"px",this.iframe.style.height=t.height+"px",this.size=t,this.listener.onIframeLoaded())}}class e{setInitialScale(t){return this.initialScale=t,this}setMinimumScale(t){return this.minimumScale=t,this}setWidth(t){return this.width=t,this}setHeight(t){return this.height=t,this}build(){const t=[];return this.initialScale&&t.push("initial-scale="+this.initialScale),this.minimumScale&&t.push("minimum-scale="+this.minimumScale),this.width&&t.push("width="+this.width),this.height&&t.push("height="+this.height),t.join(", ")}}class i{constructor(t,e){this.window=t,this.listener=e,document.addEventListener("click",(t=>{this.onClick(t)}),!1)}onClick(t){if(t.defaultPrevented)return;const e=this.window.getSelection();if(e&&"Range"==e.type)return;let i;i=t.target instanceof HTMLElement?this.nearestInteractiveElement(t.target):null,i?i instanceof HTMLAnchorElement&&this.listener.onLinkActivated(i.href):this.listener.onTap(t),t.stopPropagation(),t.preventDefault()}nearestInteractiveElement(t){return null==t?null:-1!=["a","audio","button","canvas","details","input","label","option","select","submit","textarea","video"].indexOf(t.nodeName.toLowerCase())||t.hasAttribute("contenteditable")&&"false"!=t.getAttribute("contenteditable").toLowerCase()?t:t.parentElement?this.nearestInteractiveElement(t.parentElement):null}}class s{constructor(e,s,n,a){this.fit="contain",this.insets={top:0,right:0,bottom:0,left:0},this.scale=1,e.addEventListener("message",(t=>{t.source===s.contentWindow&&t.ports[0]&&this.page.setMessagePort(t.ports[0])})),new i(e,{onTap:t=>{const e={x:(t.clientX-visualViewport.offsetLeft)*visualViewport.scale,y:(t.clientY-visualViewport.offsetTop)*visualViewport.scale};a.onTap(e)},onLinkActivated:t=>{throw Error("No interactive element in the root document.")}}),this.metaViewport=n;const h={onIframeLoaded:()=>{this.onIframeLoaded()},onTap:t=>{const e=s.getBoundingClientRect(),i={x:(t.x+e.left-visualViewport.offsetLeft)*visualViewport.scale,y:(t.y+e.top-visualViewport.offsetTop)*visualViewport.scale};a.onTap(i)},onLinkActivated:t=>{a.onLinkActivated(t)}};this.page=new t(e,s,h)}setViewport(t,e){this.viewport==t&&this.insets==e||(this.viewport=t,this.insets=e,this.layout())}setFit(t){this.fit!=t&&(this.fit=t,this.layout())}loadResource(t){this.page.hide(),this.page.loadPage(t)}onIframeLoaded(){this.page.size&&this.layout()}layout(){if(!this.page.size||!this.viewport)return;const t={top:this.insets.top,right:this.insets.right,bottom:this.insets.bottom,left:this.insets.left};this.page.setMargins(t);const i={width:this.viewport.width-this.insets.left-this.insets.right,height:this.viewport.height-this.insets.top-this.insets.bottom},s=function(t,e,i){switch(t){case"contain":return function(t,e){const i=e.width/t.width,s=e.height/t.height;return Math.min(i,s)}(e,i);case"width":return function(t,e){return e.width/t.width}(e,i);case"height":return function(t,e){return e.height/t.height}(e,i)}}(this.fit,this.page.size,i);this.metaViewport.content=(new e).setInitialScale(s).setMinimumScale(s).setWidth(this.page.size.width).setHeight(this.page.size.height).build(),this.scale=s,this.page.show()}}class n{constructor(t){this.nativeApi=t}onTap(t){this.nativeApi.onTap(JSON.stringify(t))}onLinkActivated(t){this.nativeApi.onLinkActivated(t)}}const a=document.getElementById("page"),h=document.querySelector("meta[name=viewport]");window.singleArea=new class{constructor(t,e,i,a){const h=new n(a);this.manager=new s(t,e,i,h)}loadResource(t){this.manager.loadResource(t)}setViewport(t,e,i,s,n,a){const h={width:t,height:e},o={top:i,left:a,bottom:n,right:s};this.manager.setViewport(h,o)}setFit(t){if("contain"!=t&&"width"!=t&&"height"!=t)throw Error(`Invalid fit value: ${t}`);this.manager.setFit(t)}}(window,a,h,window.gestures),window.initialization.onScriptsLoaded()}(); //# sourceMappingURL=fixed-single-script.js.map \ No newline at end of file diff --git a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map index 92eafc1dc0..a823bae92d 100644 --- a/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map +++ b/readium/navigators/web/src/main/assets/readium/navigators/web/fixed-single-script.js.map @@ -1 +1 @@ -{"version":3,"file":"fixed-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n }\n setMessagePort(messagePort) {\n messagePort.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onMessageFromIframe(event) {\n const message = event.data;\n switch (message.kind) {\n case \"contentSize\":\n return this.onContentSizeAvailable(message.size);\n case \"tap\":\n return this.listener.onTap({ x: message.x, y: message.y });\n case \"linkActivated\":\n return this.listener.onLinkActivated(message.href);\n }\n }\n onContentSizeAvailable(size) {\n if (!size) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n this.listener.onIframeLoaded();\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\nexport function parseViewportString(viewportString) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportString))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n window.addEventListener(\"message\", (event) => {\n if (event.source === iframe.contentWindow && event.ports[0]) {\n this.page.setMessagePort(event.ports[0]);\n }\n });\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n const boundingRect = iframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","setMessagePort","messagePort","onmessage","message","onMessageFromIframe","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","event","data","kind","onContentSizeAvailable","onTap","x","y","onLinkActivated","href","onIframeLoaded","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","document","addEventListener","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","SingleAreaManager","metaViewport","fit","insets","source","ports","page","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","pageListener","boundingRect","getBoundingClientRect","setViewport","viewport","layout","setFit","loadResource","safeDrawingSize","content","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","querySelector","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"fixed-single-script.js","mappings":"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","sources":["webpack://readium-js/./src/fixed/page-manager.ts","webpack://readium-js/./src/util/viewport.ts","webpack://readium-js/./src/common/gestures.ts","webpack://readium-js/./src/fixed/single-area-manager.ts","webpack://readium-js/./src/util/fit.ts","webpack://readium-js/./src/bridge/fixed-gestures-bridge.ts","webpack://readium-js/./src/index-fixed-single.ts","webpack://readium-js/./src/bridge/fixed-single-bridge.ts"],"sourcesContent":["/** Manages a fixed layout resource embedded in an iframe. */\nexport class PageManager {\n constructor(window, iframe, listener) {\n this.margins = { top: 0, right: 0, bottom: 0, left: 0 };\n if (!iframe.contentWindow) {\n throw Error(\"Iframe argument must have been attached to DOM.\");\n }\n this.listener = listener;\n this.iframe = iframe;\n }\n setMessagePort(messagePort) {\n messagePort.onmessage = (message) => {\n this.onMessageFromIframe(message);\n };\n }\n show() {\n this.iframe.style.display = \"unset\";\n }\n hide() {\n this.iframe.style.display = \"none\";\n }\n /** Sets page margins. */\n setMargins(margins) {\n if (this.margins == margins) {\n return;\n }\n this.iframe.style.marginTop = this.margins.top + \"px\";\n this.iframe.style.marginLeft = this.margins.left + \"px\";\n this.iframe.style.marginBottom = this.margins.bottom + \"px\";\n this.iframe.style.marginRight = this.margins.right + \"px\";\n }\n /** Loads page content. */\n loadPage(url) {\n this.iframe.src = url;\n }\n /** Sets the size of this page without content. */\n setPlaceholder(size) {\n this.iframe.style.visibility = \"hidden\";\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n }\n onMessageFromIframe(event) {\n const message = event.data;\n switch (message.kind) {\n case \"contentSize\":\n return this.onContentSizeAvailable(message.size);\n case \"tap\":\n return this.listener.onTap({ x: message.x, y: message.y });\n case \"linkActivated\":\n return this.listener.onLinkActivated(message.href);\n }\n }\n onContentSizeAvailable(size) {\n if (!size) {\n //FIXME: handle edge case\n return;\n }\n this.iframe.style.width = size.width + \"px\";\n this.iframe.style.height = size.height + \"px\";\n this.size = size;\n this.listener.onIframeLoaded();\n }\n}\n","export class ViewportStringBuilder {\n setInitialScale(scale) {\n this.initialScale = scale;\n return this;\n }\n setMinimumScale(scale) {\n this.minimumScale = scale;\n return this;\n }\n setWidth(width) {\n this.width = width;\n return this;\n }\n setHeight(height) {\n this.height = height;\n return this;\n }\n build() {\n const components = [];\n if (this.initialScale) {\n components.push(\"initial-scale=\" + this.initialScale);\n }\n if (this.minimumScale) {\n components.push(\"minimum-scale=\" + this.minimumScale);\n }\n if (this.width) {\n components.push(\"width=\" + this.width);\n }\n if (this.height) {\n components.push(\"height=\" + this.height);\n }\n return components.join(\", \");\n }\n}\nexport function parseViewportString(viewportString) {\n const regex = /(\\w+) *= *([^\\s,]+)/g;\n const properties = new Map();\n let match;\n while ((match = regex.exec(viewportString))) {\n if (match != null) {\n properties.set(match[1], match[2]);\n }\n }\n const width = parseFloat(properties.get(\"width\"));\n const height = parseFloat(properties.get(\"height\"));\n if (width && height) {\n return { width, height };\n }\n else {\n return undefined;\n }\n}\n","export class GesturesDetector {\n constructor(window, listener) {\n this.window = window;\n this.listener = listener;\n document.addEventListener(\"click\", (event) => {\n this.onClick(event);\n }, false);\n }\n onClick(event) {\n if (event.defaultPrevented) {\n return;\n }\n const selection = this.window.getSelection();\n if (selection && selection.type == \"Range\") {\n // There's an on-going selection, the tap will dismiss it so we don't forward it.\n // selection.type might be None (collapsed) or Caret with a collapsed range\n // when there is not true selection.\n return;\n }\n let nearestElement;\n if (event.target instanceof HTMLElement) {\n nearestElement = this.nearestInteractiveElement(event.target);\n }\n else {\n nearestElement = null;\n }\n if (nearestElement) {\n if (nearestElement instanceof HTMLAnchorElement) {\n this.listener.onLinkActivated(nearestElement.href);\n }\n }\n else {\n this.listener.onTap(event);\n }\n event.stopPropagation();\n event.preventDefault();\n }\n // See. https://github.com/JayPanoz/architecture/tree/touch-handling/misc/touch-handling\n nearestInteractiveElement(element) {\n if (element == null) {\n return null;\n }\n const interactiveTags = [\n \"a\",\n \"audio\",\n \"button\",\n \"canvas\",\n \"details\",\n \"input\",\n \"label\",\n \"option\",\n \"select\",\n \"submit\",\n \"textarea\",\n \"video\",\n ];\n if (interactiveTags.indexOf(element.nodeName.toLowerCase()) != -1) {\n return element;\n }\n // Checks whether the element is editable by the user.\n if (element.hasAttribute(\"contenteditable\") &&\n element.getAttribute(\"contenteditable\").toLowerCase() != \"false\") {\n return element;\n }\n // Checks parents recursively because the touch might be for example on an inside a .\n if (element.parentElement) {\n return this.nearestInteractiveElement(element.parentElement);\n }\n return null;\n }\n}\n","import { computeScale } from \"../util/fit\";\nimport { PageManager } from \"./page-manager\";\nimport { ViewportStringBuilder } from \"../util/viewport\";\nimport { GesturesDetector } from \"../common/gestures\";\nexport class SingleAreaManager {\n constructor(window, iframe, metaViewport, listener) {\n this.fit = \"contain\" /* Fit.Contain */;\n this.insets = { top: 0, right: 0, bottom: 0, left: 0 };\n this.scale = 1;\n window.addEventListener(\"message\", (event) => {\n if (event.source === iframe.contentWindow && event.ports[0]) {\n this.page.setMessagePort(event.ports[0]);\n }\n });\n const wrapperGesturesListener = {\n onTap: (event) => {\n const tapEvent = {\n x: (event.clientX - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.clientY - visualViewport.offsetTop) * visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLinkActivated: (_) => {\n throw Error(\"No interactive element in the root document.\");\n },\n };\n new GesturesDetector(window, wrapperGesturesListener);\n this.metaViewport = metaViewport;\n const pageListener = {\n onIframeLoaded: () => {\n this.onIframeLoaded();\n },\n onTap: (event) => {\n const boundingRect = iframe.getBoundingClientRect();\n const tapEvent = {\n x: (event.x + boundingRect.left - visualViewport.offsetLeft) *\n visualViewport.scale,\n y: (event.y + boundingRect.top - visualViewport.offsetTop) *\n visualViewport.scale,\n };\n listener.onTap(tapEvent);\n },\n onLinkActivated: (href) => {\n listener.onLinkActivated(href);\n },\n };\n this.page = new PageManager(window, iframe, pageListener);\n }\n setViewport(viewport, insets) {\n if (this.viewport == viewport && this.insets == insets) {\n return;\n }\n this.viewport = viewport;\n this.insets = insets;\n this.layout();\n }\n setFit(fit) {\n if (this.fit == fit) {\n return;\n }\n this.fit = fit;\n this.layout();\n }\n loadResource(url) {\n this.page.hide();\n this.page.loadPage(url);\n }\n onIframeLoaded() {\n if (!this.page.size) {\n // FIXME: raise error\n }\n else {\n this.layout();\n }\n }\n layout() {\n if (!this.page.size || !this.viewport) {\n return;\n }\n const margins = {\n top: this.insets.top,\n right: this.insets.right,\n bottom: this.insets.bottom,\n left: this.insets.left,\n };\n this.page.setMargins(margins);\n const safeDrawingSize = {\n width: this.viewport.width - this.insets.left - this.insets.right,\n height: this.viewport.height - this.insets.top - this.insets.bottom,\n };\n const scale = computeScale(this.fit, this.page.size, safeDrawingSize);\n this.metaViewport.content = new ViewportStringBuilder()\n .setInitialScale(scale)\n .setMinimumScale(scale)\n .setWidth(this.page.size.width)\n .setHeight(this.page.size.height)\n .build();\n this.scale = scale;\n this.page.show();\n }\n}\n","export function computeScale(fit, content, container) {\n switch (fit) {\n case \"contain\" /* Fit.Contain */:\n return fitContain(content, container);\n case \"width\" /* Fit.Width */:\n return fitWidth(content, container);\n case \"height\" /* Fit.Height */:\n return fitHeight(content, container);\n }\n}\nfunction fitContain(content, container) {\n const widthRatio = container.width / content.width;\n const heightRatio = container.height / content.height;\n return Math.min(widthRatio, heightRatio);\n}\nfunction fitWidth(content, container) {\n return container.width / content.width;\n}\nfunction fitHeight(content, container) {\n return container.height / content.height;\n}\n","export class BridgeGesturesAdapter {\n constructor(gesturesApi) {\n this.nativeApi = gesturesApi;\n }\n onTap(event) {\n this.nativeApi.onTap(JSON.stringify(event));\n }\n onLinkActivated(href) {\n this.nativeApi.onLinkActivated(href);\n }\n}\n","//\n// Copyright 2024 Readium Foundation. All rights reserved.\n// Use of this source code is governed by the BSD-style license\n// available in the top-level LICENSE file of the project.\n//\nimport { FixedSingleBridge } from \"./bridge/fixed-single-bridge\";\nconst iframe = document.getElementById(\"page\");\nconst metaViewport = document.querySelector(\"meta[name=viewport]\");\nwindow.singleArea = new FixedSingleBridge(window, iframe, metaViewport, window.gestures);\nwindow.initialization.onScriptsLoaded();\n","import { SingleAreaManager } from \"../fixed/single-area-manager\";\nimport { BridgeGesturesAdapter } from \"./fixed-gestures-bridge\";\nexport class FixedSingleBridge {\n constructor(window, iframe, metaViewport, gestures) {\n const listener = new BridgeGesturesAdapter(gestures);\n this.manager = new SingleAreaManager(window, iframe, metaViewport, listener);\n }\n loadResource(url) {\n this.manager.loadResource(url);\n }\n setViewport(viewporttWidth, viewportHeight, insetTop, insetRight, insetBottom, insetLeft) {\n const viewport = { width: viewporttWidth, height: viewportHeight };\n const insets = {\n top: insetTop,\n left: insetLeft,\n bottom: insetBottom,\n right: insetRight,\n };\n this.manager.setViewport(viewport, insets);\n }\n setFit(fit) {\n if (fit != \"contain\" && fit != \"width\" && fit != \"height\") {\n throw Error(`Invalid fit value: ${fit}`);\n }\n this.manager.setFit(fit);\n }\n}\n"],"names":["PageManager","constructor","window","iframe","listener","this","margins","top","right","bottom","left","contentWindow","Error","setMessagePort","messagePort","onmessage","message","onMessageFromIframe","show","style","display","hide","setMargins","marginTop","marginLeft","marginBottom","marginRight","loadPage","url","src","setPlaceholder","size","visibility","width","height","event","data","kind","onContentSizeAvailable","onTap","x","y","onLinkActivated","href","onIframeLoaded","ViewportStringBuilder","setInitialScale","scale","initialScale","setMinimumScale","minimumScale","setWidth","setHeight","build","components","push","join","GesturesDetector","document","addEventListener","onClick","defaultPrevented","selection","getSelection","type","nearestElement","target","HTMLElement","nearestInteractiveElement","HTMLAnchorElement","stopPropagation","preventDefault","element","indexOf","nodeName","toLowerCase","hasAttribute","getAttribute","parentElement","SingleAreaManager","metaViewport","fit","insets","source","ports","page","tapEvent","clientX","visualViewport","offsetLeft","clientY","offsetTop","_","pageListener","boundingRect","getBoundingClientRect","setViewport","viewport","layout","setFit","loadResource","safeDrawingSize","content","container","widthRatio","heightRatio","Math","min","fitContain","fitWidth","fitHeight","computeScale","BridgeGesturesAdapter","gesturesApi","nativeApi","JSON","stringify","getElementById","querySelector","singleArea","gestures","manager","viewporttWidth","viewportHeight","insetTop","insetRight","insetBottom","insetLeft","initialization","onScriptsLoaded"],"sourceRoot":""} \ No newline at end of file diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt index fc919f951b..bbf4adf591 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/DoubleViewportSpread.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier @@ -19,7 +20,6 @@ import org.readium.navigator.web.layout.DoubleViewportSpread import org.readium.navigator.web.util.DisplayArea import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.webapi.FixedDoubleApi -import org.readium.navigator.web.webview.LoadingState import org.readium.navigator.web.webview.rememberWebViewStateWithHTMLData import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi @@ -42,12 +42,14 @@ internal fun DoubleViewportSpread( baseUrl = state.publicationBaseUrl.toString() ) - val layoutApi = remember(webViewState.webView, webViewState.loadingState) { + val scriptsLoaded = remember(webViewState.webView) { + mutableStateOf(false) + } + + val layoutApi = remember(webViewState.webView, scriptsLoaded.value) { webViewState.webView - ?.takeIf { webViewState.loadingState is LoadingState.Finished } - ?.let { - FixedDoubleApi(it) - } + .takeIf { scriptsLoaded.value } + ?.let { FixedDoubleApi(it) } } layoutApi?.let { api -> @@ -78,7 +80,8 @@ internal fun DoubleViewportSpread( context ) }, - backgroundColor = backgroundColor + backgroundColor = backgroundColor, + onScriptsLoaded = { scriptsLoaded.value = true } ) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt index 89a973ca84..a45807feaa 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SingleViewportSpread.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier @@ -19,7 +20,6 @@ import org.readium.navigator.web.layout.SingleViewportSpread import org.readium.navigator.web.util.DisplayArea import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.webapi.FixedSingleApi -import org.readium.navigator.web.webview.LoadingState import org.readium.navigator.web.webview.rememberWebViewStateWithHTMLData import org.readium.r2.navigator.preferences.Fit import org.readium.r2.shared.ExperimentalReadiumApi @@ -42,12 +42,14 @@ internal fun SingleViewportSpread( baseUrl = state.publicationBaseUrl.toString() ) - val layoutApi = remember(webViewState.webView, webViewState.loadingState) { + val scriptsLoaded = remember(webViewState.webView) { + mutableStateOf(false) + } + + val layoutApi = remember(webViewState.webView, scriptsLoaded.value) { webViewState.webView - ?.takeIf { webViewState.loadingState is LoadingState.Finished } - ?.let { - FixedSingleApi(it) - } + .takeIf { scriptsLoaded.value } + ?.let { FixedSingleApi(it) } } layoutApi?.let { api -> @@ -78,7 +80,8 @@ internal fun SingleViewportSpread( context ) }, - backgroundColor = backgroundColor + backgroundColor = backgroundColor, + onScriptsLoaded = { scriptsLoaded.value = true } ) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt index cfeda9b6a3..ae1b078a97 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/spread/SpreadWebView.kt @@ -16,6 +16,7 @@ import org.readium.navigator.common.TapEvent import org.readium.navigator.web.util.WebViewClient import org.readium.navigator.web.webapi.GesturesApi import org.readium.navigator.web.webapi.GesturesListener +import org.readium.navigator.web.webapi.InitializationApi import org.readium.navigator.web.webview.WebView import org.readium.navigator.web.webview.WebViewScrollable2DState import org.readium.navigator.web.webview.WebViewState @@ -28,6 +29,7 @@ import org.readium.r2.shared.util.AbsoluteUrl internal fun SpreadWebView( state: WebViewState, client: WebViewClient, + onScriptsLoaded: () -> Unit, onTap: (TapEvent) -> Unit, onLinkActivated: (AbsoluteUrl, LinkContext?) -> Unit, backgroundColor: Color @@ -36,6 +38,10 @@ internal fun SpreadWebView( val spreadNestedScrollConnection = SpreadNestedScrollConnection(scrollableState) + val initializationApi = remember(onScriptsLoaded) { + InitializationApi(onScriptsLoaded) + } + val gesturesApi = remember(onTap) { val listener = object : GesturesListener { override fun onTap(offset: DpOffset) { @@ -50,6 +56,7 @@ internal fun SpreadWebView( } LaunchedEffect(state.webView) { + state.webView?.let { initializationApi.registerOnWebView(it) } state.webView?.let { gesturesApi.registerOnWebView(it) } } diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/InitializationApi.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/InitializationApi.kt new file mode 100644 index 0000000000..417bab5d8e --- /dev/null +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webapi/InitializationApi.kt @@ -0,0 +1,18 @@ +package org.readium.navigator.web.webapi + +import android.webkit.JavascriptInterface +import android.webkit.WebView + +internal class InitializationApi( + private val onScriptsLoadedDelegate: () -> Unit +) { + + fun registerOnWebView(webView: WebView) { + webView.addJavascriptInterface(this, "initialization") + } + + @JavascriptInterface + fun onScriptsLoaded() { + onScriptsLoadedDelegate.invoke() + } +} diff --git a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt index 4d56f554fe..40d279a1ab 100644 --- a/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt +++ b/readium/navigators/web/src/main/java/org/readium/navigator/web/webview/ComposableWebView.kt @@ -28,9 +28,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.viewinterop.AndroidView import androidx.core.view.ViewCompat -import androidx.core.view.postDelayed -import androidx.webkit.WebViewCompat -import androidx.webkit.WebViewFeature import org.readium.navigator.web.gestures.Fling2DBehavior import org.readium.navigator.web.gestures.scrollable2D import org.readium.navigator.web.webview.LoadingState.Finished @@ -159,7 +156,6 @@ internal fun WebView( webView?.let { wv -> LaunchedEffect(wv, state) { snapshotFlow { state.content }.collect { content -> - state.loadingState = LoadingState.Loading when (content) { is WebContent.Url -> { wv.loadUrl(content.url, content.additionalHttpHeaders) @@ -175,9 +171,6 @@ internal fun WebView( ) } } - wv.onContentReady { - state.loadingState = LoadingState.Finished - } } } } @@ -256,12 +249,6 @@ internal class WebViewState(webContent: WebContent) { */ var content: WebContent by mutableStateOf(webContent) - /** - * Whether the WebView is currently [LoadingState.Loading] data in its main frame (along with - * progress) or the data loading has [LoadingState.Finished]. See [LoadingState] - */ - internal var loadingState: LoadingState by mutableStateOf(LoadingState.Initializing) - /** * A list for errors captured in the last load. Reset when a new page is loaded. * Errors could be from any resource (iframe, image, etc.), not just for the main page. @@ -348,21 +335,3 @@ internal fun rememberWebViewStateWithHTMLData( historyUrl ) } - -/** - * Will run the given [action] when the content of the [WebView] is fully laid out. - */ -private fun WebView.onContentReady(action: () -> Unit) { - if (WebViewFeature.isFeatureSupported(WebViewFeature.VISUAL_STATE_CALLBACK)) { - WebViewCompat.postVisualStateCallback(this, 0) { - action() - } - } else { - // On older devices, there's no reliable way to guarantee the page is fully laid out. - // As a workaround, we run a dummy JavaScript, then wait for a short delay before - // assuming it's ready. - evaluateJavascript("true") { - postDelayed(500, action) - } - } -} From db92c7074e4fd20500d0fd61444156ff2e302183 Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Sat, 26 Oct 2024 16:14:45 +0200 Subject: [PATCH 61/61] Finish DemoActivity if no book was selected --- .../src/main/java/org/readium/navigator/demo/DemoActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt index 9d9abf3248..e5f61d6087 100644 --- a/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt +++ b/readium/navigators/demo/src/main/java/org/readium/navigator/demo/DemoActivity.kt @@ -43,7 +43,7 @@ class DemoActivity : FragmentActivity() { uri?.let { val url = requireNotNull(it.toAbsoluteUrl()) viewModel.onBookSelected(url) - } + } ?: run { finish() } } override fun onCreate(savedInstanceState: Bundle?) {

      H5IQ(kFvzT68vBe%nHnHaixT1Lk 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 S%da7RD(dR$weTUlpa0p?|LLv( diff --git a/readium/navigators/web/scripts/OEBPS/page03.jpg b/readium/navigators/web/scripts/OEBPS/page03.jpg deleted file mode 100644 index 1f2afe8ce4b4d812f7c8e6a093cb116ac9d3374b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91966 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 AbN~PV diff --git a/readium/navigators/web/scripts/OEBPS/page04.jpg b/readium/navigators/web/scripts/OEBPS/page04.jpg deleted file mode 100644 index c70dc6be57b1982360343181db616ecbffd8735e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85318 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 z 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

    H5IQ(kFvzT68vBe%nHnHaixT1Lk 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 S%da7RD(dR$weTUlpa0p?|LLv( literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/page03.jpg b/readium/navigators/web/scripts/OEBPS/page03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1f2afe8ce4b4d812f7c8e6a093cb116ac9d3374b GIT binary patch literal 91966 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 AbN~PV literal 0 HcmV?d00001 diff --git a/readium/navigators/web/scripts/OEBPS/page04.jpg b/readium/navigators/web/scripts/OEBPS/page04.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c70dc6be57b1982360343181db616ecbffd8735e GIT binary patch literal 85318 zcmeFZ1z1(f_cwkBDG8D8R21n3fg>Va(hb6)8xA2Lt)SE)B&3nnYHILv(LxR=RwzGC1oT*NJvPaN5Bts zzImVWp@qG(J=DV9ftH(%10--?MgjE(=;F9`dHvnxA`NBzf>cX+M;pb+EC7I@3N>zb`K%PD{_q z&MxNQU}H)vZg1=0;%w@~&i+8{0qsM18C5k}fEhcxgd#mHy@j*0gAhBro0}V((M5JP zh`sGaMkxD3Cwm7|CuetgfGaCdfX&3&gdV8xdo_QM3!s`fMGo%65a0GaJAG z3bX%cW}u#b*M5|oE}F*38F(muRQBsF`b+EkKgW9hLbVG!`O$cse{9E}288)vG9Xom zkqyvC{NH9ge^Tq$P6x1>pMB1+{mXyNWHf+r&=N44{|iT~zfkR0)A>1G{SS;+KN|Q? z&*%RwW7glO_p1&4?0znq;)i?lZ+AaX7h|>WUax}@;DsAn+L_rKe)nYly@BfwZmF1w zl?&9_)Z~JwVhZ`qvHaBv|Jj-NljHrL^hW>5EBja18&mj)Q+UyEKU~F&@PGJf@waMT zl>Qx8Aa*$2HJMe?aEv=J~7Ky!?EBApho*0JZ+L&_6uVKRfyV$#(r`?*HoM z1FiY*`1$`R^Itjozj>&C^7Maa_rEjz-%*cq|fm^uR!Pk#{YpF6F8 znfLgW+n?u@{$BZiuHhfL#f!NQepU|7i|G#@K_PCwKTLo8W263axA-qF?*CoWQnxeu z|7S%1-@wNHLD#?O8h;M!e>Hvg->~2Rp<(^Ee&hG|6rlbu9M}IhGvGff`!^Q+H>3F9 zkbe&D066f^J@Egq1v@yH{J${3|DBq@8|2khY2|+o@)sz_|HvT!iwh|BPzIP+xxoE? zyzKw#2XSz)aRJu+o3r;%t|S1zxdN|z^7atx-x!%0*+5O%FR-nDD(dX+@H@x#uhAy} z*!!hVSG%06_?=k4&UpM&9sjE458v_6TK*H4zfe;6R~`SU;O|xZQSqPM%-^O_{;c8; z4Tae+0Z~z`OYC;-63l%JLIM7zfgf-n&m!MD-#XtyK|@wSF~4#PtTTbB14L}jMDx}{FlI`44aqaYnQcOaJi5I_`k%RZ(gS1 z{#Fp|3;K>o<6P2Efh+Z8PO?A7QT8t5n3q@Jg7m!<)@2-!^r8&YcRU;GSIIByMA^U0 zBMo9VGXqj=fGgTBrM^?rUnTrX;ksn416+UP;k~4={zkdf@f#2afgAvQ{Vxxc&lkym znRNc&NxN(rj0@hE*gc>(^1bipFRe%oq<}ydt@yot$S*=Ds=(#DJ{M6C3Mr6<1PI`P z9)O%cMj&&LJ;)A33sMC^fY?Qd1H=j90dfE}{LAq>+69*jZht&}m*Llhi(B&x-Ok0v z28dl4A)2whi=7En$=C|=Te=FwnG=XzDxn4}TClOVGY8_AhrFqo^Y7#Lo$YPE$G?lA zVs7zE`lW(sP#a5#DOAHo9tspk`a?ZeF4F+=b>Kw5jL1Cr9dC4VCwmu%KakLXwFBms zcBXbNwm=zd3Dpbk0BQ=*fH;nki?h9yshz14(C1w|P9Qa)6Z<7I*7wX8l#3J@TXS0A z?|-%aC@xMmY7$y%KvlnM{6A6@pysB3pr9GqII9_%|AB@JF}1N#GkxqV1C>@&kTGVt-r{AF|~h5 z{$uv5#^&PoHug@xYh3*A{O?QsngA35Dcajzv^A!)y@QgAGt~6=hJ$4T7}CE`v5oDW z0fYJ%`c>c-Tl_iu<+FI}q9PDBa3X!l1wRf*1Kg)EB+r zMI)vGr#ldw2Z0uVlWG@43PL*n-C7>xi#`Qx+E zoNKta*9dWOaS1OjxP;$};Qu=e&fkOZF#vVaP>|?B$oNPo_(jW9C3>^=h{kxG*>H;V63!W%I$C$7pJXxRuR37GyS+GK zp14u7Ir@IpuZD{k7I~0|D8xpM@0SU?33eAyydD{9f}OF4gb=l$ccfGy#BI&q_hv?G znp+BN*S9OAAe-4jH(cjlW2n9!abs|ALFOdDTIU7m7MYyUL8)zrFZS8z;aqJ;g5^9) zuXE5_zr+zvj)@p?YKlk&)9%90dJ8in!PDETG{+k+*Uv#(Z&<5|eGLsX@NHwY6~kSM z?LW_z)oq+o8DwyAemSK|Y5c~^CM>Cw@YKgchc&5HGP^He7&l$FoUMa>^297?a?BDG zc6<(U8=qVC8L(GR-VefUNIaG%5h^0Tg93lHdV-e&?zKHU2Pr#LnVFjJrx&$1d{9S0lQUn{1U z9{lVLTPr)OSf_o$zT-tSBS#($Tc4d9qofGFJFdrntb1JNojA}i+GL+qU_GLAkfATX#>&BF;03z`aVF0TSg@BuUgo-uCiaL6ZZB45U z9meHyW(`HZ1Re98Cd`DI+7=ALZ=WJlw_2zbtMQ1Y-0m`DQQwNJ;oS3-@2w1aexUC8 z(eTkU$fm{I?$F1waZDH!!mWmELvZJb9S; z)w1BcAHH*Ss?LI-Bs5d!Q|pmWu3BQ8IQB@SHu@evGTy#dr~YuFc2U-+-rA`<5SQrV z-m&p^#z$K9A4c>`3H|KYo^Ymzlgu0dvJ~#&@sISbt6RJrT>FHlv z@?Fsn9Y^Xb^tz53xwP`^Rqwp8_vg3yakyV?KXp2OLN}z&ElE>XTtK=+(oDxJTtv(aN;Mxykv6sr|uIozuGk>-6-L1Fh&dQ$FRVU71XD48lx-;)Ceh zJ{pD#Z)8Oi;ulCv!JB#1d5H`4JLJ4dt2%C#xYeZ$r~qj9{+w1FCt>Uf`9f z&2x~%na78ziUcdmo261UU&v)nR&A?3Qr6)X1(+Es@Tq_mq}dB`%%tkm9ZOjpApCkg zlpRgeyzDb3cGe=tQ}ySdp0l{4wt_AwS5F|H*F(zdH@oXODxP(xpHRhW&cL|WVUZrWLw2;eS2KYrq058 z(IR!Aek)in zm4^d9VRw!YIvYBj&Oine#)gJpueK`kV zA`G)reOC!MP=`eye>{8=e-xTj_{ju>m%X?**W)FkJUGI|qHsAK7{_f-co-OHx&}uzamUs8q7!uITP7v9uTO6utPb8`en#28@q>S6BXJ3>~Wt<9N5g*Cr;;pW` zc>BT<%Jf6Yc{g{FT8@VTUyrxBp3I#OtT~m62wStG+h-#s^QPL!MaLS|j)XFQsZBoz zWp+}pY^LS<&@h)xdjAMDcMn=ryh zfhk!au+Qf5jN_LW*A)|a9@u-J6v94_6-eeh?5zxkI$+{tzWRXX)v|{0snZ1ydV5TE zxN1mJ@xT2jUi=8^=Q*#mtE0iM+GfG)+-=m*u>naV5$yOZH844ucp7-o5W=|8;gfcb z<&%@7(;lDtVqrU}l5c%BQV%APRk%QiFvFd5P@PFXTWb89NPLrMFXA zF_>&+{vTlI0v_RRTb1f-UM@#Rrh)0YvnaW)MQlq#1ygY5{e->&mhg){do9xh}q~{BdQ46K=cpU6k({D9a)~;WzFE z427eg(5!OtIa0>2YnvH^rHC9&J5RT#0|rCeMar?ID&Kz=qpa)^-R!C|?J3XUcSef@ z^XeZ7gqr6JbFF*9M_J0oN_jsed|`u6Px0H(^dMl>XE^5SV|f&mCj`1ll65n+QC@ZR z3SS@%L4)U@;SdUThLpAsil}R}-u64*W-FBA%VzZVm8bD{&q0B3(q4qkY4b|Q`(nrj zAG%^2)XA|Wzq@jGumuMc`*y>ind$_Vezc*Bo)0mLZ+Gpkdd@R}!-po$&%fuTQGGV8 z1&sYVcHQk&J&UA0njVhp6(8py+N$TEyVhWtTA8ke&ck?PlIxEf3)-&T5GA__eM-j? zB^q&M2T`w?0}MZdjta$31iSIFa;A?^;JYzU8 z_r~o+mu26l**g;dNK0+bvy3HBIKeTY`Lr$kyTRE;Ku* z$hWiYIRm$W%IWmMN6tY_MQh?D?9V^a_A5V+IPKFe`PyL4vhp#JF2m`AOG!EZSsz?C zKF+LyGJnpfV{OI8>;|i2)m)FuCIv-Rz8j)?$s2Y`57Im40vV=)Q2y6np1~>YO?Pq`@!k6w%) zmH6Ch_u`!L1Y8A@Z(nwOV%5hU!-C5L1L-DX~qG3hqn=wdEMcpH#S*hAD`z$5E4bQGF>5PBzVi@+J zk|9+7Drikn)XrE>>S_Erh^-Tc^r?a(RE$DzL2Rfe(KVN*oX7Us*Y^i_2uUJO8@tzD zv-dIg)DJ6rnWm98nJtX)$t~KQdJQ?N&j-Iac_b5I;z1XaGkkewwqXe7_ziU(gLV#q zT@a(d<2Wvnxruu{^<#R{xg2+8Uuj*}bEXk@D_m&~ll&5??pDD=)n3OtO^Z)(Qk1eZ zVH&5Ha1Qbx3T0p@A(GyC;SD2D%5A7No8?MD!ey*2zYzr3k>l*-d&0 z`_JrOn`uZa;8n`9&N*RfJRHqtGcA1G^)@;LPc(4l4%%BN8A2q# zgantMH7{=Z^ubf!$ehmgsNX3+9p$R`lA^I(!gb|n5f%-83f0q*8-YBPL_P)2z&cMy zSpw;mlN48(|Jo4!ywjr*M5$JesRSB~8s} z(@|DNjJ4gCmTsT*hyRH~=+V+}T}jLyuV5<7?%ZG`=x2)weyi@mB{8zKT; zjY)3Ea9q!AL#iu5>)`b3E*Z1a->(n}&x=Wh*|MA(sdsm`ysgrAV6EJb_DmSkb%hOZ z?rV&yAEoy2Tc0w6n-L%HbCQ;KbahKsdu?;6ddS>rpz$>xE>`p&4uPgl@6z9OU#d`c(^daE~qp;w^-e>_0tIH)qWRPH>1E~CyT3uoj zTbc)PROJ0gj7M}Pka34iuN?RRM<7zJ39RQ#b2l~|?}b@Ah*6gFlqJCM=pC#4yTIEi z>}rgPk$!_xT~8FR7BV(1LCL*7C@_pzKas{S&fGyJ5RrNpCLft0ne83Iu$OX3H0tdA ze46jH;1>GIHEGJKQXj6y<+Ia}jLs;543n8JC~+Z#<>XZS4Y2c}tydvKU-?bAN)%!$ zn+_&-K-RDt&uZJ5x;>2>uUz~$zTSb3k3})YTf$sNBfP-ot6sc0W7LcOD>i)S#M=EW)qE^}`u zi?eYlx_3l_p1}hf*K^Q-*H!9l4o5O;3p}FAw3?;3IK`nYv+Y^)6AJvYw^ZT4Bdg!* z&T(jKQP{Ck8F`dD0>@@Xp@@<=&@zXozeP))oe{}P8Ly*rLru!@_34>Vjg3YMcB3}y!ipx;Ek0H)9Sy<{SxY>taLUx#IVYvhs z+xyF@urZVWwU^*NCAibcT)`=X@{=G8%2)%buyK^t)937fzg{S-*cF(a4V9g;-;{u4ZLLmPorwS8urdUR^-qUrpFg?MRk zMqx(sJ&su^hPBw7ZCJ5k<&;YyBbv5&!um~G{nw_ctkT$*1LZr+`@HEvf5K5Rq2dVf%IPc1DL!- zvTMoAktzy@R24HkES$90>1=PnOYgI7UCxyCj43fqKk^ukR{z*|M_JQs1{E~*B!slW z=Chl~s9l%4X|Z)upF+y~9MrnBV~yGTn~?Sz;Lee!zLxO1LtRb0Mf>ipyq#y#Vej^G z!8V1jXL3%63=M`tC=w`wcWiT?7b-97M8Ez`>d@$O*g42|EN}k}S$x&j2V2#$Z3o*l zf}<)Po3oaoQRZ2SjT(*}z4q(i3Ys#>)ltz1dLMx}%?NhpMGrMnzflUD^rb4cN!)Y2sM?T_c~8D9NJI?Jwy{?eQV!CI*I#Y~Fkwa=oY zJi;57jbD{y;s}@s!0WLM?>`5np5fR|el7KV;&VlD+VcY)d<#F%68$XL%GR-{`$=4> zlRGOy=p4kFDz^5n>PbcruHzk)Ai_+rB+U}w1e>M^SPMLS14TK6t%1*n;rROgowyb= z1)Zyke8+@U6nM2$Ygds`o$JEU%m<6qxNW*gaZ(*B$km|Akxf+mqn>?{ z+)yK%+7|@HzQTQm>)2o|`{E9&B5Tfqc)CgvzeAm#xzx8E=b&aEzI+qsl|fzAh2XGa zYs=bJ607xk>)ZC#rk-G#_3ER##*N^%_?p#R;Yq!L7m#9h&m8ZyyR$nilgHEB1D-w` zRw;7&(T*QnmXq+L-_yNDkqC?R-l#7GK-7~-H^Rq@>jJMq9fHy{t6=eg|Si>#O zu8pl7@m&?{Mi2w8fA8$JN?YH8vi^alzOupLdOs!zf7?2F>&<7Mw&JYO(s;|~z7&~P zZtBsCK93$%0gpzB^j-(c1$}Wq_>3TWRrOu`r-h8>aZu(qebQ~&rZ+3?fH}`88=Yi( zaNa_&O|#j0Xyp>O56?=?dw#sx9~g`_Koi zso+|3O0(OD!I6&7UJR6RqH(4=3o@?ahcaiGe2oaK%~%2cH-^GtIuC5DrM5iD6RJpf z{M~R7V&6`0u(25Un(+!nHWWaiT(S4*=ox4pJoXX=CWlrTGy2p0tJJ!z?E4`CG>keF z-ZH!kV{m6^Z>ar#>N)6%u~rSA*-U9oRsQ1e<5j~9U7y(Heq{+BwaN8I5DK^scx*ac zJ~A+J_zX#_^wmb`_Nbzl$W;m{QxX$!i^iK{7W>oFu6?ceN*{hXvKK}EYGB94i?jcD{^kz$=FFzGL+&(AU_(lV*{bI`sEWSKG@KrA@OmLMD@FpvvBQd zg(C2iwLC~^B9@3V+0NTyyPLe;_!+15%yqLdBgd@IXU+P| zQLV-Hl^}~9?>$wmxSAKJuMjAE)BqZ7&;aR8cmf=Xb`;ldU&q8wy zC#@HKC%z##RZJWBmY&fTn2j>uAE}>`x<=2~zWwEF-2rur;awa-abEmJIV^GSA z`OK@`j%ZY1$MZaWG|pPIi4+AE*)-ov?VLgI625^@*>^@f`k)w@K3)5AVV|-J5x+0g zUZ-pn$bC$mGo&#!h{%G#Lm{uye7|O<_FfyQYdHA4Vm)Q4%;uTYFZJU1B~yIlIEVrz zrv1vq!ZArphn)PBzjnPSyQ;t#ShLRi z#b@%F%Z+Xa%lc|Ky+=>oLXlz*z8>p;NBUuHx~!j z3ni8{Fh#GZj?A5U(z~iJZ)xVQmEl1`hBW72lWDDhnF-3*EyE^H?pq5mr#hsw`sq^` zPuZQBM$N&)Ip*TFeN1I(v~D)@*WHuyr~TA8fV)o6nd`%2boj=U(@%KckI`^GqzxP<%)eE!{8D;BddlZO?qEU}OfhY9>;XqA9fp zUG1)uHM)gEYA}^$Dm>^teO7W*KmEOIJAX5-6=po1g2s;BO^fCl2KLHjm{BsUkkT|fc17Ptu3UzVfjGr4VJjef>z6#p zAX*qF5;BMipg9327ZAPxyCZiH5eWaL#YZ~;*}asG1)wAU65hQ~3pjpA{Nw*8HV-t_Pi+1t zHvbcw|B222#O8lu^FOiqpV<6QZ2l)U{}Y@4iOv7S=6_=IKe73r*!)jy{wFs76Py2u z&Hu#ae`51LvH73a{7-EDCpP~RoBxT;{~w9X1AD8*K^SOgz_woubaZq~Obje+LLBU? zSFy>i6W|e2k<(C9kyBFAGO{tz(z7s7Qr_af&BDRS!^1q0>7O0vnjqF&OTbH4yIc^o%}Jeh)GDv$Zyyw1qX%FfBn%P)UZQCU@8Q~S2LrM0cS<3nfH;Lz~M=-Bwg^Hssu#x*v z6u9Z}#qF(Y5(Vv(0nd3Q)t$D%Y= zP1h>#lWaSiSB4QBjn8C79_I&8S%^d`a{RE>@ytS(PZ3R z#IlGRvTSFCyb&IQ@e;igET6!_L_hA1xm+d-jc{{f#^X$Uy>xt#>-@$?FQIK8f&H zhn^SCtw+;KN$UFRB(;Z`1SXHLu{7?)*VQeWV|TOm<57HQ0N+)Sd_&0}6VqOKV7<#Ie4W?9|I zO&+eoA*L`*UaL#*5$^MKgth0A-N$LDWZSuiQc|S;e1!$mur|lN2L@GZ*{8Z9sO_-| zmK79#728ra{}rASn7=;nmVE`#Er0|CI@4=+_NdlDr;G zybV>BkoVwccZf4z-JFI{S#k{9p+4d#L|dJWRCw{>xIICU13I>w$0Y>G5d*d;=g!Dc zCwmM%C=*|7eCey5Ff$GaIz5R#!Ky(Vo4V6mA4zjvBJcYxKq)*n6sh4qU3W{dG~63oDcY!`Q^3!a{O?q-To{IVvc zd6DW6lqYe#dxU*VacHS7J|@1S`qXxTlfg@z-a=_e>z{%TT zCA=G=YP`z4u4a#O+RAkeLUb`t8s8+3aV;{^Y$3rE6_7MPr-nY>XxBT4(9r zg;&?n-$UXqcSf&K@&4M!cql+sP_XlCylmKXX#6Ax3HPz7aDf*_LHompIb>4V7Y3R; zY^T88Fpi0OKy+pEv?1A?wR+Loh4 z?`r0vVYE(MJ4e*p|G038dpqnN#n*Q3c1d)G{rm_+87vvr`qYRl*X;xe)GAMB(nH=J z6(=R}p>#RiPdzF+2X}+Uz7S8#>%Tg>YL{{NG<e@!P=wZjcU)bl1NTnyL>hXOC* zvan;Fa=d3AgX|vsKL0iqYzX|SBM`n~AJijIiU(rC}5%DiU088;rq z`%(93!g$5{KxaHFGoh>S9t&G&p~pk6roVp z%o)EivTb>0&J?haytyDv5i#2M&U|>qDCqDon{=$SBZnsqDZ%yTc5a>6=kc6*{2qQ< zIQmY8z!J(mTV4!c$1p=#FPY_}xI%__gu zrzrIB-uzdwwP5jUVbgfPmN3G657)kh~&-*axt-kW_WG`i3s|qd(r6V!j8c&^pf^M4@7QrXg4Ik zC5Ho>R|t68aAg+!9CU@9H+p!k03RxucgxNY4zjxGx&Qv;b3fab?2VbE)Gj|JDom>9 zS#pAzG~7rj&DlbZ8><3YJ%omgbNA71)aUUX_Q>0qC_jq^Z)5pCW~0|{vCf6h2MfkI z3dlI$P$B%P>W{IH(2(b6749VFOJ|5aF=%OA)Y&3*i0>%278rRtrR-Lg^X8>-QtYCG z5PUz=lp(^>!ISzn?med9{=`t>aIlUM?IYz*`>*N2;g*q(at_Q~$C8-&gG#l*;YvAK zayS*cp=IMa{Z3Yeu}gV^7J>C$C1gkSpw4uoy40r%0V6$@;+B-cujf_i8EIA6(}q+)UOy=_SKIf)@b24LmFb5I=LgJ zJw(@Fw4sL{w*85GIr&|pHWyJ78R;bOMUV6%>!8ehrI=`qjHhhj-)vp5Gl`5M#Cj#n ztlic!Ecrb`1MVQ(p&a-0&<+UOKrY<-S{kvq_ zftK5msZiND0ayEb9w`$id9zQZg!4=>Z{L->|9&s!Dc*9Qw{>cOT4PurXP(5e7S#vN zs4Q|R4rvb16mFF=!bw-|Mn^=FLLURByrq`p@{CC)n6;m<-LlRM_S6>p$G>OQ(_{LuhbQL|&hv@ZE4@U<`Z1nB=W3 zIR7Y&K=d2Kp*p@A@gHU(U@@tc|g~H%%ZEjyb zzb14lN%XuATXzWLV8@d4?}nl|rip1CkOQVpBf~4I5Y7@y(ss?-Non*7T}v(Bor@!%On2&EJE2dZyqm9atuFjijgLvAZ;T?zt2B{S1u`z3zzmrINU)zcCT zOct9k*^I2N4pnSA##>m#Vu6$1UqSnQB~;Ay2{M*YvN{#!RBloolbHE@QDoK_07ZtlN{NR&BM-0*Q4tNNt8aA z!U!)b1;bVXtHI(|nVnU$l6P3=(NS^JMe2{ot~ig~)SA?I`F@F+rJRH{WeMIvb;Wsi zoy*G~GphM9`Jl?Pj4K&UdX$IgbY31~yh1#Q(7Pq!IiUQa{s-`b;RdV5Hd?6_-SV9gx5b)DCyJs&A@+%buo(95d3y4pju z#FFKU4j-sIf1bAYE|z*8R4vr>hNp;7`NHYw;JSxoMsABK;3jNW-D-E7ff?-=OSQaR z>M0V|v{9OBaCtuuek39SW^Nm)Ox@gk(B3vUDSVp3zVH&ZAkx?p%pTXdOB;eF$vhyN z6GP=@zMJ(0A{*ku4|$rUV)>wMLGGhJ9$JmxaB=y z`;Lnza?_M4pP-4>o9L5*Z06YQ&Gz6>-nH61h*z~{;4We&p1w>5PE$=nVF>kqJ$4O4|kFHp&__DvoGOH4_VSsQt+0QaO>T!TQ-Q%!VKV_ z7cfB60vTd=V48x*Iq0KFq}M&>RUTo(Z-xgI(f9AXcU_1B$F0dvb_}g4Qo5#DJZ1p4 z*<&e(LQ_8$-TbsBD}7>#&Ao@r-FDYuDijJ|cr}%~5>c%Pm3CvCMWWo5I_e=pY7*>x zoqAjNi^0Ur4EGVC)aDdpX92y)jnKgkRKE}-E)P4x;vh@>+cj}7L;cpLQB+9n;vpXF z4VZb|p_wM;)r8(>_c`w4iTB7wT459%SOXvYVZD}`#Uu4NZPln_RdbYSn}J-MJntwT zWy@j}av+_tT7IoK{;-cw_$y**WQTzvP(`%D-I3bQhgt7q>1pDYk#y)YS$`5H6kr=` zs#UO7tlDCuqi&q*YiZo~{J0vWG0oGYM_4U)QkMxk{uIyZ-AzkopSptlEmK_-@)S6a zSvMbBH#x)?{1lp+SFrv(4TMf~AIGd$4~0E;ZpQo0J&s9T2I|@p1Kvet1C|vvuaqz> zJdxXSYIw|&b+7zO3Me(a+N-hhbZunML9=K0`-RNLc|)4fyw3#X9)w*@%&dZWro2Pi z(B_`49De4mMI=`q(1|je-$8i@C9|U}vrB?g59={VL7YAam;;~5!3DNky?eEouO7WT z$fS2mQbMXA)>|=l-Dd4P@u1L|ggLQlQbY zTunw^FWwT_hQ@K`+{x=OHgc_9qN?W(2vFp{Ly0n!B~x3>m7Dm`YoR5zE5nvmYl|y# zGvSc!Z3-mxtT)Tu9{8%;mZ*P1#PrOqz7MGe*7qr{T04>5j}_??EU-vgigKJv%Urb$ zBF8zA&$BkYQiBtknx!|L611DgajOk*3)Vvk)g$`XJE-u|b5ynNJfbwOq+b?bj9j-Q zautnOh<#&kKRAgX#MvVVBwM6e)K<$Qy;HtO!jzuoLH^11ox#q=+ow>LsPW7%`5SwL zpvB$du7iWSSIM?-fb0DEVrsvj`DD3^MDg(5cYlt_iFJZu`-R|dGHiU>gnL+-CPC4U+TEvXHohUo)R~pjZ*JFq)M*rwNxqpworf09 zpYj;Bm+nwR2^cIbK_gQd_UmsI+wuu{mnd>hsq9xJqw-}h z+^ww&?8>KPt~MydQ_QY-Hq>O2M>$5J)SI4Y0r3^`SWTJ6Pbj$Axy4DmXOR{kXVe^C zx1-3RB<%8DU`=tjSi4oZo#8sSffdXHYZey?v)Q@?~wZtX+lhcx17r*IJMHSR6T zYS+L!SyHvfpWVz^@|8gN{U+wS2Zdhs0=vz+`*=pT4W{r7b(IKxg(Jx5sUhyJ>wz3X zPJ(^k)KYD^b;QY^?Iu4N1Dy_pI>;P|^y$15a}D0>IR{bi;&gQ1?_LH6p;U{{WvN$J zSw2co51Y{rDcIqs+^0R*{46vgj!)z|<2OI8o^iePtG<4DwzNMlO6T=*oSFD}<7Dfs z(<++saw)sfuePpx{1s1=0##20NLPy_uJjDe%4=veGqa8N^81AnpM&s}kK}{{KE4ZF zOJ$`ewxNkpyz6q%SLw{mne@_RU%)gd_;9cv_?n-R9}BCR-Q5`^L5W8-AEqZhi?oRj zwQ718izctKRPAQiyz+*S(C~3TgUp4F3U4ru&Z;SkFWohLGEDISCE9Q3D^E4XfKIEe z8TI`q>zy?iy+ZRlbI;T)JN4hMB#UZp#iee(g;Z|7Lle+;Y6?#7NKq2(wZ8kXZrG&E zt+u8$ya^h9KLS@YDdmbl*2r?MDd#c=(N$u{@W*`^LU1bPt93js%0zk3D-7)82TjUX zDNo%`Z&{TH<=xeHl~hsW9E0fevc_`C4(8U)wvp~?$2gIM`^O$wW(Q8^E)$k^sM&37 z21LR-r=cz|h@kC1D$=tjO7 zIW#(JwpdyFUE|%hX)gFP9Ut*296EC39o657L37q#-&NpSba|KI99du|vALV78Zh`S z=}Lyaq_Uf}RR4b2{`49zrp3N@=BTEV!Mfx6Yu@T`M*LU$a_J)FNT_(;sWJLPyn-dd z`cyNm5lvObfu^5ii@A_Q$BAIJ3wM+Gnl_7A{hsHw)HEsg%3(iR6gZ1fY*A5@nSZOq z-ixe7@v&VCB!Dt@4l>IzcxI~NaUkZM(D&C=pzWkyw=68vADASqCb(jSx@8woyRk3aZi?w6%gWQa8m%}VO3=e^=E2!U zfw9PgtPo}1@1kIGWU7?LVDOV>lL!KP?R^m- zv;~DS2S+mq2=rBA*Dm_q`y%;x-ADF*_haRnW0ki~Xo_CkO4rUoN&SkMj@-zt8I*9r z4K0sCPc|z5`Mm3}^j@i>{o+VfE5D>uYktj8<`&WEr(VV22|IAgogf-qE7k*{((PDF z!fTm31(cK{+H@`gGm#Pj?(#dFy+h&F57L|$8XP-b>20q#xN=e7a5;*L?i);t>@%prh2A$tF%NOvCmEVraH; zHBXL5N9a05CEmO}?#$jQZk1OcC7TbnVZZULcc<>P{ky;rR!b_K zRGqSi7i$ZP+(^nw2wlfGUp%zapb|U1z0fsHc_fpXR)}#UYUEJt=AcLVXKNKI0}_xz zeBvd4}*ZP066xf^j5i-E!=+mkf-)9FJP61alUNKHp5qZ657^ zq$wheG8t#FrL?M;!NW&Pehno;QOUrPjJthNxzF9!rZ(a6(E9YK9^%Ayce1_Lr=bP8 zHh&>c#Q+{gCkdS(uDsfmJz3F5+sl#f^L*?MQR|^*9%J`ayNytYV4hvJXOQJh+b#4i z?)NKcpqnk>ZUG5LCyIg#%#2l1Irsgu(5KB`Y!?$WSMx328TF zMk!&}rlxm=wrFRJcxa7J#S-xCCnmXjSye&ik7=6iaT z2K$}?lE_P30eC?fi?yfYjUnMZ?5OncQ938C*3^%@mYXv!ES+XSr`c8~XhFwwiKa5o;~k6w7F%n&W&MQI~G zODYt7fEbYt4l+by^R%N~C2d*k02s1o?cZylsIq+AJiq@G|5 zR16e6AAiu+S5cQTY3_PdD5jgWiAJ9yYACbZ!pEGha>V+uz~`snDfR+34{LET8zeuw zM*y^k_=)ZZ81@yHX(C*$%S|K23cs0<#ie7|4!JyascgsE^y$MG;8;Q6kRNIO@$NI) zu#>*Bmi}E%_|vjlY%T0baj7Y|k!OZC3zb|epG^M%oby&7Yi({uk^H-8*cFZ>LGpjJ zM{<9qE}bLX$d-Z`c1;*|wQd!Tai8~b%}IHr#60+|C5mZc=14jPKF6rXN<3-VRIbOq0F$#M282dDt>Hs$j{+c5#VX1x{VWW zmNNr=#bR-h{n739sG|EPSs;eva}cewZb<5L`J8jbW9?xm?Wu)q9e-)fPi5v^g6dOc z+$pKCC^n{{ZW(FE(R#pJjcpMZnv; zX;MP5s=wdn@qlr#p4k|Nm2s*!McVgy=7e}HDjj(DOHS=pS+A~buI>D|w=h=oq7Ap^ zCp)?AP_Ch8aRl+ogoTlwF&5wfY?3pMf0imetof7dc0z<2w3dv{)M1+w%wzK6fgT_g zh)_;2SHGv@R}uu6M+(MFWpK@KNqwwwyZw+epTO0KT`nh+&sb7T!QngFL%W0DJ!-u7 zQYH1oQH|z66>_{M9S(Z+uIgC1doD=6yPP#}i`#Q~6%r|ti+OksY>$tR%iGhDLN$XiQOZN14z60I%D-92nh7IBX{)a=!< zj#Ou@B$9FlNd0LR)?zp-{{R9NC)nl-lFI)8LxWr0BY~;DfR@i73|OlARMFW)oR!J- zHDV!%)mRPK=A6tIx8YeiJ&mJIDGU)NbF@>8YTRIcRGB396sK_M%`Ho^A(Fy52N_f9 zwN^xy&|*R6N1wfpN7k>2uyIX!1b~g$s#0cBrx&W+uN;U#!w+g!^8H6X_@*0sQPm0d z=99^^JezPy_03(;mn^)AN0+-BhJLg&ra7jp7TEbqqo^wE*hJ@TfC%sLIhkra$tl2nWidF>CDI8UM zxIWQoEIG#IARm6!V>zJnQz-K$nQ7VF-y%el*;C*lzWXmihr-OY_A-$9^dEEtlG`zK&%cy zrzkFK^p>mj9GkWJtq7joSdvbCs+G(x05OlQeJfHyx1y0$re|!8pNTceQqguUoSP|a zkp}^ly;Sw36J3n$xqd&}Jbo1Bjj~C84`I@n6_Y&xJ^d&!HaC;s8NjI$HD2sVrs~b^$D-&$u*3)}9_H!K^{19%HmKUZ-RgMZ z!xPBu$*EQZQJf#nvz6K<%_cyQsELUky46dyWr$;`=qq)ROnX4>+OjWK5xD3;II4^} zBuppF$%o5w=dndO{41I9g`zZRIRGR6>6>mq$pmMPoEqqk?=TKC!U%ToD;Z(qVNkgKMChhV~ zfEF?62d}+o>G!e=yNid3fSHcSln@V1yGN!!kf0EkGDmY9&_rA@1OUtLjz>8M@HIaC zAG46~(~W3z#an;CvuyfeI@?VHKK}r}asldnO5^l~%^aNuBOhS`~$MgS-RJL6gw+6E`OY)RNwq6Bg~eUkK% zSiHr%1ePQC7@mNS)E?r9t8B;1%36lT6<1l^W4ORyowmjS?eG3iTBi3gEz?_EJGG2# zUn+K)JKz(@{C>2PU8T;k1-$2fnBo?3#xi?*lY)JKr|QjhB#mbx!;5sn;WOp}PEL9g z*PrWJ$}L*`PI@?qR;f6{ri5BcCA8BC9nH1OO%w2W0|Wv1uOC{y<_UbO#GJ;#^D!rP zmPiYbr<@)+1oC$)!8@<@S zW|gOcSIiOQd2q%4vBz%T{cn1+e`n>~%EU&6qg}CrSpghijNpBF`c=z#1ky=7%pi>z z@gwu~X71g;N`m%irM75o0tm?)rfvf<812{SJu5zE&1md$dv0l6l+)~SSwVK!Z1+2x z_alIqBm;rdr+!6GC8^YGF0Z82I9&Ni=aI(*`sbc1!^0i3&jdE_F@OUj2umUybU5kx z8mwoso#d8y#9mT`8?s8a-oOm^{HvxHgp(#t6;q0LA+&}I0p>QrBB?AwnHUq)`(*lJ zr@7a!A+cL9sT^^TJfs}R2LLk;+3k+iD&4i!irTxVwUaE(3gw7Vo(2K@{{T9Eon>LE zY8OvBlCZ+g$kM8lj(Eoad*t=5+1Hv^Z*$417{*+&TNxKRt--foV%aohjB-cG3_uK7 zNa@p_*chh9k$sZV)*e?LY^T_B-`57MU)d+ws3bmHkkRU=U=x9P{C+OKL-@Nb^RF5-5pBk6>WV++>rHf-`~m@l>?g z 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