@openlist-frontend/openlist-frontend 4.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/README.md +35 -0
  2. package/dist/VERSION +1 -0
  3. package/dist/assets/2fa-5bdf0110.js +1 -0
  4. package/dist/assets/2fa-legacy-0c55633e.js +1 -0
  5. package/dist/assets/About-daba5276.js +1 -0
  6. package/dist/assets/About-legacy-9ff9dba7.js +1 -0
  7. package/dist/assets/AddOrEdit-183fec42.js +1 -0
  8. package/dist/assets/AddOrEdit-3b829ac7.js +1 -0
  9. package/dist/assets/AddOrEdit-4fd0b862.js +1 -0
  10. package/dist/assets/AddOrEdit-legacy-573b0c54.js +1 -0
  11. package/dist/assets/AddOrEdit-legacy-d1ee72b5.js +1 -0
  12. package/dist/assets/AddOrEdit-legacy-ec8fe9cb.js +1 -0
  13. package/dist/assets/Common-ce07cb56.js +1 -0
  14. package/dist/assets/Common-legacy-bd61ee62.js +1 -0
  15. package/dist/assets/Copy-0dde9202.js +1 -0
  16. package/dist/assets/Copy-legacy-97a5757e.js +1 -0
  17. package/dist/assets/Decompress-46c8605d.js +1 -0
  18. package/dist/assets/Decompress-legacy-caf8f948.js +1 -0
  19. package/dist/assets/DeletePopover-71e3a164.js +1 -0
  20. package/dist/assets/DeletePopover-legacy-21b9ab49.js +1 -0
  21. package/dist/assets/File-45a9403e.js +1 -0
  22. package/dist/assets/File-legacy-46eaff03.js +1 -0
  23. package/dist/assets/Folder-4b4cbf82.js +114 -0
  24. package/dist/assets/Folder-6651c4e8.css +1 -0
  25. package/dist/assets/Folder-legacy-31c4976b.js +49 -0
  26. package/dist/assets/FolderTree-2e9d5bd7.js +1 -0
  27. package/dist/assets/FolderTree-legacy-5d22cfeb.js +1 -0
  28. package/dist/assets/Grid-234a02fe.js +1 -0
  29. package/dist/assets/Grid-legacy-495d4986.js +1 -0
  30. package/dist/assets/GridItem-16e70035.js +1 -0
  31. package/dist/assets/GridItem-legacy-be81be17.js +1 -0
  32. package/dist/assets/ImageWithError-021dba09.js +1 -0
  33. package/dist/assets/ImageWithError-legacy-18c02107.js +1 -0
  34. package/dist/assets/Images-34d8f7f6.js +1 -0
  35. package/dist/assets/Images-legacy-38fd271a.js +1 -0
  36. package/dist/assets/Layout-b9429b34.js +5 -0
  37. package/dist/assets/Layout-legacy-3ee006d4.js +6 -0
  38. package/dist/assets/List-7e506ba3.js +1 -0
  39. package/dist/assets/List-legacy-c5c98f42.js +1 -0
  40. package/dist/assets/Messenger-96b59f61.js +1 -0
  41. package/dist/assets/Messenger-legacy-f3295638.js +1 -0
  42. package/dist/assets/Metas-c26c167c.js +1 -0
  43. package/dist/assets/Metas-legacy-7f8d02fa.js +1 -0
  44. package/dist/assets/Other-1d9c6d82.js +1 -0
  45. package/dist/assets/Other-legacy-8b7794e9.js +1 -0
  46. package/dist/assets/PackageDownload-8640957f.js +1 -0
  47. package/dist/assets/PackageDownload-legacy-de7a5bb7.js +1 -0
  48. package/dist/assets/Paginator-5f358313.js +1 -0
  49. package/dist/assets/Paginator-legacy-92532ae7.js +1 -0
  50. package/dist/assets/Password-59d3df3b.js +1 -0
  51. package/dist/assets/Password-legacy-5ea54977.js +1 -0
  52. package/dist/assets/Profile-c724b1ec.js +1 -0
  53. package/dist/assets/Profile-legacy-243a8814.js +1 -0
  54. package/dist/assets/PublicKeys-8c0d13eb.js +1 -0
  55. package/dist/assets/PublicKeys-legacy-bc214c77.js +1 -0
  56. package/dist/assets/ResponsiveGrid-68858d59.js +1 -0
  57. package/dist/assets/ResponsiveGrid-legacy-87350386.js +1 -0
  58. package/dist/assets/S3-f73ff557.js +1 -0
  59. package/dist/assets/S3-legacy-e0622f9f.js +1 -0
  60. package/dist/assets/SettingItem-fc04014d.js +1 -0
  61. package/dist/assets/SettingItem-legacy-ba401f77.js +1 -0
  62. package/dist/assets/SourceHanSansCN-Bold-b5627435.woff2 +0 -0
  63. package/dist/assets/Storages-3ea6d5fc.js +1 -0
  64. package/dist/assets/Storages-legacy-826c99da.js +1 -0
  65. package/dist/assets/TimesNewRoman-d9fb32eb.ttf +0 -0
  66. package/dist/assets/Upload-ab40bb1f.js +5 -0
  67. package/dist/assets/Upload-f2d26146.js +1 -0
  68. package/dist/assets/Upload-legacy-4e741898.js +6 -0
  69. package/dist/assets/Upload-legacy-6063e4f4.js +1 -0
  70. package/dist/assets/Users-798157f0.js +1 -0
  71. package/dist/assets/Users-legacy-f7b026c1.js +1 -0
  72. package/dist/assets/Wether-7fbfa955.js +1 -0
  73. package/dist/assets/Wether-legacy-aee6f6ea.js +1 -0
  74. package/dist/assets/aliyun_office-f050b710.js +1 -0
  75. package/dist/assets/aliyun_office-legacy-9a085ee0.js +1 -0
  76. package/dist/assets/aliyun_video-7b2f47a3.js +1 -0
  77. package/dist/assets/aliyun_video-legacy-62e99fee.js +1 -0
  78. package/dist/assets/archive-1f761af1.js +1 -0
  79. package/dist/assets/archive-legacy-49978108.js +1 -0
  80. package/dist/assets/asciinema-2c1b3849.js +1 -0
  81. package/dist/assets/asciinema-9107553b.css +1 -0
  82. package/dist/assets/asciinema-legacy-1ea98084.js +1 -0
  83. package/dist/assets/audio-43f4c02b.css +1 -0
  84. package/dist/assets/audio-e2e285d5.js +1 -0
  85. package/dist/assets/audio-legacy-059723ab.js +1 -0
  86. package/dist/assets/backup-restore-5529cead.js +1 -0
  87. package/dist/assets/backup-restore-legacy-17580db7.js +1 -0
  88. package/dist/assets/entry-15091525.js +1 -0
  89. package/dist/assets/entry-600f3f22.js +1 -0
  90. package/dist/assets/entry-legacy-1facdda0.js +1 -0
  91. package/dist/assets/entry-legacy-c4a87582.js +1 -0
  92. package/dist/assets/helper-00c542cf.js +1 -0
  93. package/dist/assets/helper-8f322b0c.js +1 -0
  94. package/dist/assets/helper-legacy-0d5506d5.js +1 -0
  95. package/dist/assets/helper-legacy-f3262afc.js +1 -0
  96. package/dist/assets/hls-7abaec7b.js +6 -0
  97. package/dist/assets/hls-legacy-59f1f515.js +8 -0
  98. package/dist/assets/html-812d7456.js +1 -0
  99. package/dist/assets/html-legacy-2960fa24.js +1 -0
  100. package/dist/assets/icon-a469f817.js +1 -0
  101. package/dist/assets/icon-legacy-9bb296c6.js +1 -0
  102. package/dist/assets/image-2891f060.js +1 -0
  103. package/dist/assets/image-legacy-76b4b8b1.js +1 -0
  104. package/dist/assets/index-03840810.js +1 -0
  105. package/dist/assets/index-0a6b4993.js +1 -0
  106. package/dist/assets/index-17ae6dfd.js +1 -0
  107. package/dist/assets/index-2cbc0cef.js +1 -0
  108. package/dist/assets/index-4edac598.js +1 -0
  109. package/dist/assets/index-531a40ba.js +1 -0
  110. package/dist/assets/index-58af8784.js +1 -0
  111. package/dist/assets/index-6e9d628c.js +1 -0
  112. package/dist/assets/index-b8129a12.js +20 -0
  113. package/dist/assets/index-c0564af7.css +1 -0
  114. package/dist/assets/index-c5258b6a.js +14 -0
  115. package/dist/assets/index-legacy-013e602c.js +27 -0
  116. package/dist/assets/index-legacy-2c6656b7.js +1 -0
  117. package/dist/assets/index-legacy-46ca7014.js +18 -0
  118. package/dist/assets/index-legacy-52780c55.js +1 -0
  119. package/dist/assets/index-legacy-570c7cb9.js +1 -0
  120. package/dist/assets/index-legacy-5b31487a.js +1 -0
  121. package/dist/assets/index-legacy-6946cc66.js +1 -0
  122. package/dist/assets/index-legacy-761a690f.js +1 -0
  123. package/dist/assets/index-legacy-774ce9eb.js +1 -0
  124. package/dist/assets/index-legacy-bfa83468.js +1 -0
  125. package/dist/assets/indexes-7fdacbd3.js +1 -0
  126. package/dist/assets/indexes-legacy-b0449218.js +1 -0
  127. package/dist/assets/ipa-3c150a8e.js +1 -0
  128. package/dist/assets/ipa-legacy-c9832b7f.js +1 -0
  129. package/dist/assets/item_type-32dc6fdf.js +1 -0
  130. package/dist/assets/item_type-legacy-d49ae974.js +1 -0
  131. package/dist/assets/lg-22b72ba5.ttf +0 -0
  132. package/dist/assets/lg-f2fe1c00.svg +54 -0
  133. package/dist/assets/lg-fefc5c0d.woff +0 -0
  134. package/dist/assets/loading-298ad3ff.gif +0 -0
  135. package/dist/assets/markdown-f6634b03.js +1 -0
  136. package/dist/assets/markdown-legacy-fa6288e2.js +1 -0
  137. package/dist/assets/markdown_with_word_wrap-4707a0bb.js +1 -0
  138. package/dist/assets/markdown_with_word_wrap-legacy-40b69e71.js +1 -0
  139. package/dist/assets/offline_download-996becf4.js +1 -0
  140. package/dist/assets/offline_download-legacy-d963670f.js +1 -0
  141. package/dist/assets/plist-2b96d2c0.js +1 -0
  142. package/dist/assets/plist-legacy-034311ee.js +1 -0
  143. package/dist/assets/polyfills-legacy-fa59231c.js +1 -0
  144. package/dist/assets/style-a6d16836.css +1 -0
  145. package/dist/assets/style-b95f98f0.js +1 -0
  146. package/dist/assets/style-legacy-e9ff46a9.js +1 -0
  147. package/dist/assets/subtitles-octopus-worker-62892886.wasm +0 -0
  148. package/dist/assets/subtitles-octopus-worker-f95f2186.js +1 -0
  149. package/dist/assets/text-editor-1bf4c68b.js +1 -0
  150. package/dist/assets/text-editor-legacy-8da7daa4.js +1 -0
  151. package/dist/assets/url-5dba48cb.js +1 -0
  152. package/dist/assets/url-legacy-30ef4b8f.js +1 -0
  153. package/dist/assets/useTitle-cbc1a4b9.js +1 -0
  154. package/dist/assets/useTitle-legacy-a0f63151.js +1 -0
  155. package/dist/assets/video-9c59731a.js +7 -0
  156. package/dist/assets/video-legacy-dd1b01de.js +9 -0
  157. package/dist/assets/video360-49c12ab3.js +14 -0
  158. package/dist/assets/video360-f0192288.css +1 -0
  159. package/dist/assets/video360-legacy-d49e810c.js +16 -0
  160. package/dist/assets/video_box-ad8c3f54.js +6 -0
  161. package/dist/assets/video_box-legacy-b67382d5.js +8 -0
  162. package/dist/assets/webauthn-json.browser-ponyfill-29d8152c.js +1 -0
  163. package/dist/assets/webauthn-json.browser-ponyfill-legacy-456cc8e1.js +1 -0
  164. package/dist/images/figplayer.webp +0 -0
  165. package/dist/images/fileball.webp +0 -0
  166. package/dist/images/iPlay.webp +0 -0
  167. package/dist/images/iina.webp +0 -0
  168. package/dist/images/infuse.webp +0 -0
  169. package/dist/images/mpv.webp +0 -0
  170. package/dist/images/mxplayer-pro.webp +0 -0
  171. package/dist/images/mxplayer.webp +0 -0
  172. package/dist/images/nplayer.webp +0 -0
  173. package/dist/images/omniplayer.webp +0 -0
  174. package/dist/images/potplayer.webp +0 -0
  175. package/dist/images/vlc.webp +0 -0
  176. package/dist/index.html +81 -0
  177. package/dist/openlist-frontend-dist-v4.0.0-rc.1.tar.gz +0 -0
  178. package/dist/static/epub.js/viewer.html +467 -0
  179. package/dist/static/manifest.json +13 -0
  180. package/dist/streamer/mitm.html +186 -0
  181. package/dist/streamer/sw.js +141 -0
  182. package/package.json +102 -0
@@ -0,0 +1,467 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>EPUB.js viewer</title>
7
+
8
+ <script
9
+ src="https://npm.elemecdn.com/jszip@3.10.1/dist/jszip.min.js"
10
+ integrity="sha256-rMfkFFWoB2W1/Zx+4bgHim0WC7vKRVrq6FTeZclH1Z4="
11
+ crossorigin="anonymous"
12
+ ></script>
13
+ <script
14
+ src="https://npm.elemecdn.com/epubjs@0.3.93/dist/epub.min.js"
15
+ integrity="sha256-BurhV0UQe0qlCMlVOCdSUfab+58RdWIfxFjZ9C7QgtQ="
16
+ crossorigin="anonymous"
17
+ ></script>
18
+
19
+ <style>
20
+ body {
21
+ margin: 0;
22
+ background: #fafafa;
23
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
24
+ color: #333;
25
+
26
+ position: absolute;
27
+ height: 100%;
28
+ width: 100%;
29
+ min-height: 800px;
30
+ }
31
+
32
+ #title {
33
+ width: 900px;
34
+ min-height: 18px;
35
+ margin: 10px auto;
36
+ text-align: center;
37
+ font-size: 16px;
38
+ color: #e2e2e2;
39
+ font-weight: 400;
40
+ }
41
+
42
+ #title:hover {
43
+ color: #777;
44
+ }
45
+
46
+ #viewer.spreads {
47
+ width: 900px;
48
+ height: 600px;
49
+ box-shadow: 0 0 4px #ccc;
50
+ border-radius: 5px;
51
+ padding: 0;
52
+ position: relative;
53
+ margin: 10px auto;
54
+ background: white center center no-repeat;
55
+ top: calc(50vh - 400px);
56
+ }
57
+
58
+ #viewer.spreads .epub-view > iframe {
59
+ background: white;
60
+ }
61
+
62
+ #viewer.scrolled {
63
+ overflow: hidden;
64
+ width: 800px;
65
+ margin: 0 auto;
66
+ position: relative;
67
+ background: center center no-repeat white;
68
+ box-shadow: 0 0 4px #ccc;
69
+ padding: 20px;
70
+ }
71
+
72
+ #viewer.scrolled .epub-view > iframe {
73
+ background: white;
74
+ }
75
+
76
+ #prev {
77
+ left: 0;
78
+ }
79
+
80
+ #next {
81
+ right: 0;
82
+ }
83
+
84
+ #toc {
85
+ display: block;
86
+ margin: 10px auto;
87
+ }
88
+
89
+ @media (min-width: 1000px) {
90
+ #viewer.spreads:after {
91
+ position: absolute;
92
+ width: 1px;
93
+ border-right: 1px #000 solid;
94
+ height: 90%;
95
+ z-index: 1;
96
+ left: 50%;
97
+ margin-left: -1px;
98
+ top: 5%;
99
+ opacity: 0.15;
100
+ box-shadow: -2px 0 15px rgba(0, 0, 0, 1);
101
+ content: "";
102
+ }
103
+
104
+ #viewer.spreads.single:after {
105
+ display: none;
106
+ }
107
+
108
+ #prev {
109
+ left: 40px;
110
+ }
111
+
112
+ #next {
113
+ right: 40px;
114
+ }
115
+ }
116
+
117
+ .arrow {
118
+ position: fixed;
119
+ top: 50%;
120
+ margin-top: -32px;
121
+ font-size: 64px;
122
+ color: #e2e2e2;
123
+ font-family: arial, sans-serif;
124
+ font-weight: bold;
125
+ cursor: pointer;
126
+ -webkit-user-select: none;
127
+ -moz-user-select: none;
128
+ user-select: none;
129
+ text-decoration: none;
130
+ }
131
+
132
+ .navlink {
133
+ margin: 14px;
134
+ display: block;
135
+ text-align: center;
136
+ text-decoration: none;
137
+ color: #ccc;
138
+ }
139
+
140
+ .arrow:hover,
141
+ .navlink:hover {
142
+ color: #777;
143
+ }
144
+
145
+ .arrow:active,
146
+ .navlink:hover {
147
+ color: #000;
148
+ }
149
+
150
+ #book-wrapper {
151
+ width: 480px;
152
+ height: 640px;
153
+ overflow: hidden;
154
+ border: 1px solid #ccc;
155
+ margin: 28px auto;
156
+ background: #fff;
157
+ border-radius: 0 5px 5px 0;
158
+ position: absolute;
159
+ }
160
+
161
+ #book-viewer {
162
+ width: 480px;
163
+ height: 660px;
164
+ margin: -30px auto;
165
+ -moz-box-shadow: inset 10px 0 20px rgba(0, 0, 0, 0.1);
166
+ -webkit-box-shadow: inset 10px 0 20px rgba(0, 0, 0, 0.1);
167
+ box-shadow: inset 10px 0 20px rgba(0, 0, 0, 0.1);
168
+ }
169
+
170
+ #book-viewer iframe {
171
+ padding: 40px;
172
+ }
173
+
174
+ #controls {
175
+ position: absolute;
176
+ bottom: 16px;
177
+ left: 50%;
178
+ width: 400px;
179
+ margin-left: -200px;
180
+ text-align: center;
181
+ display: none;
182
+ }
183
+
184
+ #controls > input[type="range"] {
185
+ width: 400px;
186
+ }
187
+
188
+ #navigation {
189
+ width: 400px;
190
+ height: 100vh;
191
+ position: absolute;
192
+ overflow: auto;
193
+ top: 0;
194
+ left: 0;
195
+ background: #777;
196
+ -webkit-transition: -webkit-transform 0.25s ease-out;
197
+ -moz-transition: -moz-transform 0.25s ease-out;
198
+ -ms-transition: -moz-transform 0.25s ease-out;
199
+ transition: transform 0.25s ease-out;
200
+ }
201
+
202
+ #navigation.fixed {
203
+ position: fixed;
204
+ }
205
+
206
+ #navigation h1 {
207
+ width: 200px;
208
+ font-size: 16px;
209
+ font-weight: normal;
210
+ color: #fff;
211
+ margin-bottom: 10px;
212
+ }
213
+
214
+ #navigation h2 {
215
+ font-size: 14px;
216
+ font-weight: normal;
217
+ color: #b0b0b0;
218
+ margin-bottom: 20px;
219
+ }
220
+
221
+ #navigation ul {
222
+ padding-left: 36px;
223
+ margin-left: 0;
224
+ margin-top: 12px;
225
+ margin-bottom: 12px;
226
+ width: 340px;
227
+ }
228
+
229
+ #navigation ul li {
230
+ list-style: decimal;
231
+ margin-bottom: 10px;
232
+ color: #cccddd;
233
+ font-size: 12px;
234
+ padding-left: 0;
235
+ margin-left: 0;
236
+ }
237
+
238
+ #navigation ul li a {
239
+ color: #ccc;
240
+ text-decoration: none;
241
+ }
242
+
243
+ #navigation ul li a:hover {
244
+ color: #fff;
245
+ text-decoration: underline;
246
+ }
247
+
248
+ #navigation ul li a.active {
249
+ color: #fff;
250
+ }
251
+
252
+ #navigation #cover {
253
+ display: block;
254
+ margin: 24px auto;
255
+ }
256
+
257
+ #navigation #closer {
258
+ position: absolute;
259
+ top: 0;
260
+ right: 0;
261
+ padding: 12px;
262
+ color: #cccddd;
263
+ width: 24px;
264
+ }
265
+
266
+ #navigation.closed {
267
+ -webkit-transform: translate(-400px, 0);
268
+ -moz-transform: translate(-400px, 0);
269
+ -ms-transform: translate(-400px, 0);
270
+ transform: translate(-400px, 0);
271
+ }
272
+
273
+ svg {
274
+ display: block;
275
+ }
276
+
277
+ .close-x {
278
+ stroke: #cccddd;
279
+ fill: transparent;
280
+ stroke-linecap: round;
281
+ stroke-width: 5;
282
+ }
283
+
284
+ .close-x:hover {
285
+ stroke: #fff;
286
+ }
287
+
288
+ #opener {
289
+ position: absolute;
290
+ top: 0;
291
+ left: 0;
292
+ padding: 10px;
293
+ stroke: #e2e2e2;
294
+ fill: #e2e2e2;
295
+ }
296
+
297
+ #opener:hover {
298
+ stroke: #777;
299
+ fill: #777;
300
+ }
301
+ </style>
302
+ </head>
303
+ <body>
304
+ <!-- <div id="title"></div> -->
305
+ <select id="toc"></select>
306
+ <div id="viewer" class="spreads"></div>
307
+ <a id="prev" href="#prev" class="arrow">‹</a>
308
+ <a id="next" href="#next" class="arrow">›</a>
309
+
310
+ <script>
311
+ var params =
312
+ URLSearchParams &&
313
+ new URLSearchParams(document.location.search.substring(1))
314
+ var url =
315
+ params && params.get("url") && decodeURIComponent(params.get("url"))
316
+ console.log(url)
317
+ var currentSectionIndex =
318
+ params && params.get("loc") ? params.get("loc") : undefined
319
+ let blob = fetch(url).then((res) => res.blob())
320
+ var book = ePub(
321
+ blob.then((blob) => blob.arrayBuffer()),
322
+ {
323
+ restore: true,
324
+ reload: true,
325
+ spreads: true,
326
+ }
327
+ )
328
+ var rendition = book.renderTo("viewer", {
329
+ width: "100%",
330
+ height: 600,
331
+ spread: "always",
332
+ })
333
+
334
+ rendition.display(currentSectionIndex)
335
+
336
+ book.ready.then(function () {
337
+ var next = document.getElementById("next")
338
+
339
+ next.addEventListener(
340
+ "click",
341
+ function (e) {
342
+ book.package.metadata.direction === "rtl"
343
+ ? rendition.prev()
344
+ : rendition.next()
345
+ e.preventDefault()
346
+ },
347
+ false
348
+ )
349
+
350
+ var prev = document.getElementById("prev")
351
+ prev.addEventListener(
352
+ "click",
353
+ function (e) {
354
+ book.package.metadata.direction === "rtl"
355
+ ? rendition.next()
356
+ : rendition.prev()
357
+ e.preventDefault()
358
+ },
359
+ false
360
+ )
361
+
362
+ var keyListener = function (e) {
363
+ // Left Key
364
+ if ((e.keyCode || e.which) == 37) {
365
+ book.package.metadata.direction === "rtl"
366
+ ? rendition.next()
367
+ : rendition.prev()
368
+ }
369
+
370
+ // Right Key
371
+ if ((e.keyCode || e.which) == 39) {
372
+ book.package.metadata.direction === "rtl"
373
+ ? rendition.prev()
374
+ : rendition.next()
375
+ }
376
+ }
377
+
378
+ rendition.on("keyup", keyListener)
379
+ document.addEventListener("keyup", keyListener, false)
380
+ })
381
+
382
+ var title = document.getElementById("title")
383
+
384
+ rendition.on("rendered", function (section) {
385
+ var current = book.navigation && book.navigation.get(section.href)
386
+
387
+ if (current) {
388
+ var $select = document.getElementById("toc")
389
+ var $selected = $select.querySelector("option[selected]")
390
+ if ($selected) {
391
+ $selected.removeAttribute("selected")
392
+ }
393
+
394
+ var $options = $select.querySelectorAll("option")
395
+ for (var i = 0; i < $options.length; ++i) {
396
+ let selected = $options[i].getAttribute("ref") === current.href
397
+ if (selected) {
398
+ $options[i].setAttribute("selected", "")
399
+ }
400
+ }
401
+ }
402
+ })
403
+
404
+ rendition.on("relocated", function (location) {
405
+ console.log(location)
406
+
407
+ var next =
408
+ book.package.metadata.direction === "rtl"
409
+ ? document.getElementById("prev")
410
+ : document.getElementById("next")
411
+ var prev =
412
+ book.package.metadata.direction === "rtl"
413
+ ? document.getElementById("next")
414
+ : document.getElementById("prev")
415
+
416
+ if (location.atEnd) {
417
+ next.style.visibility = "hidden"
418
+ } else {
419
+ next.style.visibility = "visible"
420
+ }
421
+
422
+ if (location.atStart) {
423
+ prev.style.visibility = "hidden"
424
+ } else {
425
+ prev.style.visibility = "visible"
426
+ }
427
+ })
428
+
429
+ rendition.on("layout", function (layout) {
430
+ let viewer = document.getElementById("viewer")
431
+
432
+ if (layout.spread) {
433
+ viewer.classList.remove("single")
434
+ } else {
435
+ viewer.classList.add("single")
436
+ }
437
+ })
438
+
439
+ window.addEventListener("unload", function () {
440
+ console.log("unloading")
441
+ this.book.destroy()
442
+ })
443
+
444
+ book.loaded.navigation.then(function (toc) {
445
+ var $select = document.getElementById("toc"),
446
+ docfrag = document.createDocumentFragment()
447
+
448
+ toc.forEach(function (chapter) {
449
+ var option = document.createElement("option")
450
+ option.textContent = chapter.label
451
+ option.setAttribute("ref", chapter.href)
452
+
453
+ docfrag.appendChild(option)
454
+ })
455
+
456
+ $select.appendChild(docfrag)
457
+
458
+ $select.onchange = function () {
459
+ var index = $select.selectedIndex,
460
+ url = $select.options[index].getAttribute("ref")
461
+ rendition.display(url)
462
+ return false
463
+ }
464
+ })
465
+ </script>
466
+ </body>
467
+ </html>
@@ -0,0 +1,13 @@
1
+ {
2
+ "display": "standalone",
3
+ "scope": "/",
4
+ "start_url": "/",
5
+ "name": "OpenList",
6
+ "icons": [
7
+ {
8
+ "src": "https://docs.oplist.org/logo.png",
9
+ "sizes": "512x512",
10
+ "type": "image/png"
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,186 @@
1
+ <!--
2
+ mitm.html is the lite "man in the middle"
3
+ This is only meant to signal the opener's messageChannel to
4
+ the service worker - when that is done this mitm can be closed
5
+ but it's better to keep it alive since this also stops the sw
6
+ from restarting
7
+ The service worker is capable of intercepting all request and fork their
8
+ own "fake" response - wish we are going to craft
9
+ when the worker then receives a stream then the worker will tell the opener
10
+ to open up a link that will start the download
11
+ -->
12
+ <script>
13
+ // This will prevent the sw from restarting
14
+ let keepAlive = () => {
15
+ keepAlive = () => {}
16
+ var ping = location.href.substr(0, location.href.lastIndexOf("/")) + "/ping"
17
+ var interval = setInterval(() => {
18
+ if (sw) {
19
+ sw.postMessage("ping")
20
+ } else {
21
+ fetch(ping).then((res) => res.text(!res.ok && clearInterval(interval)))
22
+ }
23
+ }, 10000)
24
+ }
25
+
26
+ // message event is the first thing we need to setup a listener for
27
+ // don't want the opener to do a random timeout - instead they can listen for
28
+ // the ready event
29
+ // but since we need to wait for the Service Worker registration, we store the
30
+ // message for later
31
+ let messages = []
32
+ window.onmessage = (evt) => messages.push(evt)
33
+
34
+ let sw = null
35
+ let scope = ""
36
+
37
+ function registerWorker() {
38
+ return navigator.serviceWorker
39
+ .getRegistration("./")
40
+ .then((swReg) => {
41
+ return (
42
+ swReg || navigator.serviceWorker.register("sw.js", { scope: "./" })
43
+ )
44
+ })
45
+ .then((swReg) => {
46
+ const swRegTmp = swReg.installing || swReg.waiting
47
+
48
+ scope = swReg.scope
49
+
50
+ return (
51
+ (sw = swReg.active) ||
52
+ new Promise((resolve) => {
53
+ swRegTmp.addEventListener(
54
+ "statechange",
55
+ (fn = () => {
56
+ if (swRegTmp.state === "activated") {
57
+ swRegTmp.removeEventListener("statechange", fn)
58
+ sw = swReg.active
59
+ resolve()
60
+ }
61
+ })
62
+ )
63
+ })
64
+ )
65
+ })
66
+ }
67
+
68
+ // Now that we have the Service Worker registered we can process messages
69
+ function onMessage(event) {
70
+ let { data, ports, origin } = event
71
+
72
+ // It's important to have a messageChannel, don't want to interfere
73
+ // with other simultaneous downloads
74
+ if (!ports || !ports.length) {
75
+ throw new TypeError("[StreamSaver] You didn't send a messageChannel")
76
+ }
77
+
78
+ if (typeof data !== "object") {
79
+ throw new TypeError("[StreamSaver] You didn't send a object")
80
+ }
81
+
82
+ // the default public service worker for StreamSaver is shared among others.
83
+ // so all download links needs to be prefixed to avoid any other conflict
84
+ data.origin = origin
85
+
86
+ // if we ever (in some feature version of streamsaver) would like to
87
+ // redirect back to the page of who initiated a http request
88
+ data.referrer = data.referrer || document.referrer || origin
89
+
90
+ // pass along version for possible backwards compatibility in sw.js
91
+ data.streamSaverVersion = new URLSearchParams(location.search).get(
92
+ "version"
93
+ )
94
+
95
+ if (data.streamSaverVersion === "1.2.0") {
96
+ console.warn("[StreamSaver] please update streamsaver")
97
+ }
98
+
99
+ /** @since v2.0.0 */
100
+ if (!data.headers) {
101
+ console.warn(
102
+ "[StreamSaver] pass `data.headers` that you would like to pass along to the service worker\nit should be a 2D array or a key/val object that fetch's Headers api accepts"
103
+ )
104
+ } else {
105
+ // test if it's correct
106
+ // should thorw a typeError if not
107
+ new Headers(data.headers)
108
+ }
109
+
110
+ /** @since v2.0.0 */
111
+ if (typeof data.filename === "string") {
112
+ console.warn(
113
+ "[StreamSaver] You shouldn't send `data.filename` anymore. It should be included in the Content-Disposition header option"
114
+ )
115
+ // Do what File constructor do with fileNames
116
+ data.filename = data.filename.replace(/\//g, ":")
117
+ }
118
+
119
+ /** @since v2.0.0 */
120
+ if (data.size) {
121
+ console.warn(
122
+ "[StreamSaver] You shouldn't send `data.size` anymore. It should be included in the content-length header option"
123
+ )
124
+ }
125
+
126
+ /** @since v2.0.0 */
127
+ if (data.readableStream) {
128
+ console.warn(
129
+ "[StreamSaver] You should send the readableStream in the messageChannel, not through mitm"
130
+ )
131
+ }
132
+
133
+ /** @since v2.0.0 */
134
+ if (!data.pathname) {
135
+ console.warn(
136
+ "[StreamSaver] Please send `data.pathname` (eg: /pictures/summer.jpg)"
137
+ )
138
+ data.pathname = Math.random().toString().slice(-6) + "/" + data.filename
139
+ }
140
+
141
+ // remove all leading slashes
142
+ data.pathname = data.pathname.replace(/^\/+/g, "")
143
+
144
+ // remove protocol
145
+ let org = origin.replace(/(^\w+:|^)\/\//, "")
146
+
147
+ // set the absolute pathname to the download url.
148
+ data.url = new URL(`${scope + org}/${data.pathname}`).toString()
149
+
150
+ if (!data.url.startsWith(`${scope + org}/`)) {
151
+ throw new TypeError("[StreamSaver] bad `data.pathname`")
152
+ }
153
+
154
+ // This sends the message data as well as transferring
155
+ // messageChannel.port2 to the service worker. The service worker can
156
+ // then use the transferred port to reply via postMessage(), which
157
+ // will in turn trigger the onmessage handler on messageChannel.port1.
158
+
159
+ const transferable = data.readableStream
160
+ ? [ports[0], data.readableStream]
161
+ : [ports[0]]
162
+
163
+ if (!(data.readableStream || data.transferringReadable)) {
164
+ keepAlive()
165
+ }
166
+
167
+ return sw.postMessage(data, transferable)
168
+ }
169
+
170
+ if (window.opener) {
171
+ // The opener can't listen to onload event, so we need to help em out!
172
+ // (telling them that we are ready to accept postMessage's)
173
+ window.opener.postMessage("StreamSaver::loadedPopup", "*")
174
+ }
175
+
176
+ if (navigator.serviceWorker) {
177
+ registerWorker().then(() => {
178
+ window.onmessage = onMessage
179
+ messages.forEach(window.onmessage)
180
+ })
181
+ } else {
182
+ // FF can ping sw with fetch from a secure hidden iframe
183
+ // shouldn't really be possible?
184
+ keepAlive()
185
+ }
186
+ </script>