rx-player 4.0.0-beta.0 → 4.0.0-beta.2

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 (297) hide show
  1. package/.eslintrc.js +8 -0
  2. package/CHANGELOG.md +93 -0
  3. package/CONTRIBUTING.md +48 -168
  4. package/FILES.md +40 -92
  5. package/VERSION +1 -1
  6. package/dist/_esm5.processed/compat/browser_detection.d.ts +25 -12
  7. package/dist/_esm5.processed/compat/browser_detection.js +85 -38
  8. package/dist/_esm5.processed/compat/can_reuse_media_keys.js +2 -2
  9. package/dist/_esm5.processed/compat/eme/close_session.js +2 -2
  10. package/dist/_esm5.processed/compat/eme/load_session.js +1 -1
  11. package/dist/_esm5.processed/compat/event_listeners.js +1 -1
  12. package/dist/_esm5.processed/compat/has_issues_with_high_media_source_duration.d.ts +21 -0
  13. package/dist/_esm5.processed/compat/has_issues_with_high_media_source_duration.js +26 -0
  14. package/dist/_esm5.processed/config.d.ts +4 -0
  15. package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +9 -6
  16. package/dist/_esm5.processed/core/adaptive/buffer_based_chooser.d.ts +18 -1
  17. package/dist/_esm5.processed/core/adaptive/buffer_based_chooser.js +106 -25
  18. package/dist/_esm5.processed/core/adaptive/guess_based_chooser.js +6 -6
  19. package/dist/_esm5.processed/core/adaptive/network_analyzer.js +8 -5
  20. package/dist/_esm5.processed/core/adaptive/utils/representation_score_calculator.d.ts +19 -1
  21. package/dist/_esm5.processed/core/adaptive/utils/representation_score_calculator.js +1 -1
  22. package/dist/_esm5.processed/core/api/debug/buffer_graph.d.ts +28 -0
  23. package/dist/_esm5.processed/core/api/debug/buffer_graph.js +175 -0
  24. package/dist/_esm5.processed/core/api/debug/buffer_size_graph.d.ts +10 -0
  25. package/dist/_esm5.processed/core/api/debug/buffer_size_graph.js +104 -0
  26. package/dist/_esm5.processed/core/api/debug/constants.d.ts +2 -0
  27. package/dist/_esm5.processed/core/api/debug/constants.js +2 -0
  28. package/dist/_esm5.processed/core/api/debug/index.d.ts +2 -0
  29. package/dist/_esm5.processed/core/api/debug/index.js +2 -0
  30. package/dist/_esm5.processed/core/api/debug/modules/general_info.d.ts +3 -0
  31. package/dist/_esm5.processed/core/api/debug/modules/general_info.js +180 -0
  32. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.d.ts +4 -0
  33. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +121 -0
  34. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.d.ts +3 -0
  35. package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +35 -0
  36. package/dist/_esm5.processed/core/api/debug/render.d.ts +3 -0
  37. package/dist/_esm5.processed/core/api/debug/render.js +32 -0
  38. package/dist/_esm5.processed/core/api/debug/utils.d.ts +39 -0
  39. package/dist/_esm5.processed/core/api/debug/utils.js +57 -0
  40. package/dist/_esm5.processed/core/api/playback_observer.js +4 -2
  41. package/dist/_esm5.processed/core/api/public_api.d.ts +60 -3
  42. package/dist/_esm5.processed/core/api/public_api.js +280 -60
  43. package/dist/_esm5.processed/core/api/track_management/media_element_tracks_store.js +10 -1
  44. package/dist/_esm5.processed/core/api/track_management/track_dispatcher.d.ts +13 -1
  45. package/dist/_esm5.processed/core/api/track_management/track_dispatcher.js +30 -15
  46. package/dist/_esm5.processed/core/api/track_management/tracks_store.d.ts +3 -1
  47. package/dist/_esm5.processed/core/api/track_management/tracks_store.js +67 -152
  48. package/dist/_esm5.processed/core/api/utils.d.ts +10 -0
  49. package/dist/_esm5.processed/core/api/utils.js +23 -3
  50. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.d.ts +27 -8
  51. package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.js +28 -7
  52. package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +1 -1
  53. package/dist/_esm5.processed/core/decrypt/content_decryptor.js +1 -1
  54. package/dist/_esm5.processed/core/decrypt/find_key_system.js +29 -6
  55. package/dist/_esm5.processed/core/decrypt/session_events_listener.js +42 -32
  56. package/dist/_esm5.processed/core/decrypt/utils/check_key_statuses.js +4 -0
  57. package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +2 -0
  58. package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +5 -1
  59. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.d.ts +17 -8
  60. package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.js +10 -6
  61. package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +5 -4
  62. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +22 -5
  63. package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +37 -21
  64. package/dist/_esm5.processed/core/fetchers/segment/task_prioritizer.js +21 -23
  65. package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +17 -7
  66. package/dist/_esm5.processed/core/init/directfile_content_initializer.js +2 -2
  67. package/dist/_esm5.processed/core/init/media_source_content_initializer.js +74 -41
  68. package/dist/_esm5.processed/core/init/types.d.ts +9 -1
  69. package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.d.ts +28 -1
  70. package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.js +24 -11
  71. package/dist/_esm5.processed/core/init/utils/create_media_source.js +3 -12
  72. package/dist/_esm5.processed/core/init/utils/end_of_stream.js +6 -3
  73. package/dist/_esm5.processed/core/init/utils/get_loaded_reference.js +2 -1
  74. package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.js +9 -5
  75. package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.js +2 -1
  76. package/dist/_esm5.processed/core/init/utils/media_source_duration_updater.d.ts +58 -0
  77. package/dist/_esm5.processed/core/init/utils/{media_duration_updater.js → media_source_duration_updater.js} +87 -86
  78. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +36 -2
  79. package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +83 -3
  80. package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.js +6 -4
  81. package/dist/_esm5.processed/core/init/utils/throw_on_media_error.js +1 -1
  82. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +18 -7
  83. package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +38 -50
  84. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +8 -0
  85. package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +16 -2
  86. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +8 -0
  87. package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +12 -0
  88. package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +11 -4
  89. package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
  90. package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +13 -9
  91. package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +30 -16
  92. package/dist/_esm5.processed/core/stream/adaptation/utils/create_representation_estimator.d.ts +47 -0
  93. package/dist/_esm5.processed/core/stream/adaptation/utils/create_representation_estimator.js +70 -0
  94. package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +41 -20
  95. package/dist/_esm5.processed/core/stream/period/period_stream.js +12 -11
  96. package/dist/_esm5.processed/core/stream/representation/representation_stream.js +37 -28
  97. package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.d.ts +4 -2
  98. package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.js +3 -3
  99. package/dist/_esm5.processed/core/stream/representation/utils/downloading_queue.js +16 -6
  100. package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.d.ts +3 -2
  101. package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.js +8 -8
  102. package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.d.ts +2 -2
  103. package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.js +2 -3
  104. package/dist/_esm5.processed/core/stream/utils/create_reload_request.js +1 -1
  105. package/dist/_esm5.processed/default_config.d.ts +41 -0
  106. package/dist/_esm5.processed/default_config.js +46 -2
  107. package/dist/_esm5.processed/errors/index.d.ts +2 -2
  108. package/dist/_esm5.processed/errors/media_error.d.ts +23 -1
  109. package/dist/_esm5.processed/errors/media_error.js +18 -5
  110. package/dist/_esm5.processed/experimental/features/debug_element.d.ts +8 -0
  111. package/dist/_esm5.processed/experimental/features/debug_element.js +10 -0
  112. package/dist/_esm5.processed/experimental/features/index.d.ts +1 -0
  113. package/dist/_esm5.processed/experimental/features/index.js +1 -0
  114. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_and_push_segment.d.ts +1 -1
  115. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_and_push_segment.js +8 -7
  116. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +7 -4
  117. package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +24 -12
  118. package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/index.js +0 -2
  119. package/dist/_esm5.processed/features/features_object.js +1 -0
  120. package/dist/_esm5.processed/features/initialize_features.js +13 -10
  121. package/dist/_esm5.processed/features/types.d.ts +3 -0
  122. package/dist/_esm5.processed/manifest/adaptation.d.ts +21 -2
  123. package/dist/_esm5.processed/manifest/adaptation.js +80 -1
  124. package/dist/_esm5.processed/manifest/manifest.js +2 -0
  125. package/dist/_esm5.processed/manifest/period.js +2 -2
  126. package/dist/_esm5.processed/manifest/representation.d.ts +33 -2
  127. package/dist/_esm5.processed/manifest/representation.js +32 -4
  128. package/dist/_esm5.processed/manifest/utils.js +1 -3
  129. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +105 -137
  130. package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +25 -5
  131. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.d.ts +1 -1
  132. package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.js +1 -1
  133. package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +1 -0
  134. package/dist/_esm5.processed/public_types.d.ts +13 -3
  135. package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.js +1 -1
  136. package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +15 -11
  137. package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +2 -2
  138. package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
  139. package/dist/_esm5.processed/transports/dash/segment_loader.js +4 -4
  140. package/dist/_esm5.processed/transports/local/segment_loader.js +13 -26
  141. package/dist/_esm5.processed/transports/smooth/isobmff/create_boxes.d.ts +4 -6
  142. package/dist/_esm5.processed/transports/smooth/isobmff/create_boxes.js +4 -6
  143. package/dist/_esm5.processed/transports/smooth/segment_loader.js +4 -4
  144. package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
  145. package/dist/_esm5.processed/utils/cancellable_sleep.js +4 -10
  146. package/dist/_esm5.processed/utils/create_cancellable_promise.d.ts +26 -0
  147. package/dist/_esm5.processed/utils/create_cancellable_promise.js +52 -0
  148. package/dist/_esm5.processed/utils/is_null_or_undefined.d.ts +1 -1
  149. package/dist/_esm5.processed/utils/is_null_or_undefined.js +1 -1
  150. package/dist/_esm5.processed/utils/reference.js +6 -0
  151. package/dist/_esm5.processed/utils/request/xhr.js +1 -1
  152. package/dist/_esm5.processed/utils/task_canceller.d.ts +34 -15
  153. package/dist/_esm5.processed/utils/task_canceller.js +55 -22
  154. package/dist/mpd-parser.wasm +0 -0
  155. package/dist/rx-player.js +5424 -4712
  156. package/dist/rx-player.min.js +1 -1
  157. package/jest.config.js +1 -5
  158. package/package.json +44 -40
  159. package/scripts/build/constants.d.ts +1 -0
  160. package/scripts/build/generate_build.js +1 -1
  161. package/scripts/fast_demo_build.js +40 -40
  162. package/scripts/generate_full_demo.js +1 -1
  163. package/sonar-project.properties +1 -1
  164. package/src/compat/browser_detection.ts +105 -52
  165. package/src/compat/can_reuse_media_keys.ts +5 -2
  166. package/src/compat/eme/close_session.ts +2 -2
  167. package/src/compat/eme/load_session.ts +1 -1
  168. package/src/compat/event_listeners.ts +1 -1
  169. package/src/compat/has_issues_with_high_media_source_duration.ts +27 -0
  170. package/src/core/adaptive/__tests__/buffer_based_chooser.test.ts +147 -48
  171. package/src/core/adaptive/adaptive_representation_selector.ts +11 -6
  172. package/src/core/adaptive/buffer_based_chooser.ts +144 -26
  173. package/src/core/adaptive/guess_based_chooser.ts +9 -8
  174. package/src/core/adaptive/network_analyzer.ts +9 -4
  175. package/src/core/adaptive/utils/representation_score_calculator.ts +22 -2
  176. package/src/core/api/debug/buffer_graph.ts +247 -0
  177. package/src/core/api/debug/buffer_size_graph.ts +130 -0
  178. package/src/core/api/debug/constants.ts +2 -0
  179. package/src/core/api/debug/index.ts +3 -0
  180. package/src/core/api/debug/modules/general_info.ts +184 -0
  181. package/src/core/api/debug/modules/segment_buffer_content.ts +155 -0
  182. package/src/core/api/debug/modules/segment_buffer_size.ts +48 -0
  183. package/src/core/api/debug/render.ts +40 -0
  184. package/src/core/api/debug/utils.ts +103 -0
  185. package/src/core/api/playback_observer.ts +5 -2
  186. package/src/core/api/public_api.ts +334 -73
  187. package/src/core/api/track_management/media_element_tracks_store.ts +17 -8
  188. package/src/core/api/track_management/track_dispatcher.ts +37 -14
  189. package/src/core/api/track_management/tracks_store.ts +77 -167
  190. package/src/core/api/utils.ts +29 -3
  191. package/src/core/decrypt/__tests__/__global__/utils.ts +61 -40
  192. package/src/core/decrypt/attach_media_keys.ts +1 -1
  193. package/src/core/decrypt/content_decryptor.ts +1 -1
  194. package/src/core/decrypt/find_key_system.ts +25 -11
  195. package/src/core/decrypt/session_events_listener.ts +45 -39
  196. package/src/core/decrypt/utils/check_key_statuses.ts +6 -0
  197. package/src/core/decrypt/utils/clean_old_loaded_sessions.ts +2 -1
  198. package/src/core/decrypt/utils/loaded_sessions_store.ts +8 -1
  199. package/src/core/fetchers/cdn_prioritizer.ts +18 -9
  200. package/src/core/fetchers/manifest/manifest_fetcher.ts +5 -4
  201. package/src/core/fetchers/segment/segment_fetcher.ts +36 -14
  202. package/src/core/fetchers/segment/task_prioritizer.ts +25 -30
  203. package/src/core/fetchers/utils/schedule_request.ts +18 -7
  204. package/src/core/init/directfile_content_initializer.ts +2 -1
  205. package/src/core/init/media_source_content_initializer.ts +89 -50
  206. package/src/core/init/types.ts +9 -1
  207. package/src/core/init/utils/content_time_boundaries_observer.ts +48 -12
  208. package/src/core/init/utils/create_media_source.ts +4 -16
  209. package/src/core/init/utils/end_of_stream.ts +6 -3
  210. package/src/core/init/utils/get_loaded_reference.ts +2 -1
  211. package/src/core/init/utils/initial_seek_and_play.ts +9 -5
  212. package/src/core/init/utils/initialize_content_decryption.ts +2 -1
  213. package/src/core/init/utils/{media_duration_updater.ts → media_source_duration_updater.ts} +103 -110
  214. package/src/core/init/utils/rebuffering_controller.ts +115 -4
  215. package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +6 -4
  216. package/src/core/init/utils/throw_on_media_error.ts +1 -1
  217. package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +63 -66
  218. package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +20 -2
  219. package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +16 -0
  220. package/src/core/segment_buffers/implementations/types.ts +16 -4
  221. package/src/core/segment_buffers/index.ts +2 -0
  222. package/src/core/segment_buffers/segment_buffers_store.ts +16 -13
  223. package/src/core/stream/adaptation/adaptation_stream.ts +33 -19
  224. package/src/core/stream/adaptation/utils/create_representation_estimator.ts +114 -0
  225. package/src/core/stream/orchestrator/stream_orchestrator.ts +42 -20
  226. package/src/core/stream/period/period_stream.ts +13 -11
  227. package/src/core/stream/representation/representation_stream.ts +49 -37
  228. package/src/core/stream/representation/utils/append_segment_to_buffer.ts +9 -4
  229. package/src/core/stream/representation/utils/downloading_queue.ts +16 -4
  230. package/src/core/stream/representation/utils/push_init_segment.ts +11 -6
  231. package/src/core/stream/representation/utils/push_media_segment.ts +3 -3
  232. package/src/core/stream/utils/create_reload_request.ts +1 -1
  233. package/src/default_config.ts +59 -11
  234. package/src/errors/__tests__/media_error.test.ts +6 -6
  235. package/src/errors/index.ts +4 -1
  236. package/src/errors/media_error.ts +67 -1
  237. package/src/experimental/features/__tests__/debug_element.test.ts +26 -0
  238. package/src/experimental/features/debug_element.ts +13 -0
  239. package/src/experimental/features/index.ts +1 -0
  240. package/src/experimental/tools/VideoThumbnailLoader/load_and_push_segment.ts +10 -7
  241. package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +7 -4
  242. package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +25 -10
  243. package/src/experimental/tools/mediaCapabilitiesProber/index.ts +0 -4
  244. package/src/features/__tests__/initialize_features.test.ts +11 -0
  245. package/src/features/features_object.ts +1 -0
  246. package/src/features/initialize_features.ts +15 -10
  247. package/src/features/types.ts +9 -0
  248. package/src/manifest/__tests__/manifest.test.ts +7 -7
  249. package/src/manifest/__tests__/period.test.ts +90 -45
  250. package/src/manifest/adaptation.ts +96 -1
  251. package/src/manifest/manifest.ts +4 -0
  252. package/src/manifest/period.ts +4 -2
  253. package/src/manifest/representation.ts +77 -5
  254. package/src/manifest/utils.ts +1 -3
  255. package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +116 -151
  256. package/src/parsers/manifest/dash/common/parse_representations.ts +21 -4
  257. package/src/parsers/manifest/dash/js-parser/parse_from_document.ts +1 -1
  258. package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -0
  259. package/src/parsers/texttracks/ttml/parse_ttml.ts +1 -1
  260. package/src/public_types.ts +16 -1
  261. package/src/tools/TextTrackRenderer/text_track_renderer.ts +1 -1
  262. package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +31 -22
  263. package/src/transports/dash/low_latency_segment_loader.ts +2 -2
  264. package/src/transports/dash/manifest_parser.ts +1 -1
  265. package/src/transports/dash/segment_loader.ts +4 -4
  266. package/src/transports/local/segment_loader.ts +14 -30
  267. package/src/transports/smooth/isobmff/create_boxes.ts +4 -6
  268. package/src/transports/smooth/segment_loader.ts +4 -4
  269. package/src/transports/utils/call_custom_manifest_loader.ts +3 -3
  270. package/src/typings/globals.d.ts +21 -19
  271. package/src/utils/cancellable_sleep.ts +5 -14
  272. package/src/utils/create_cancellable_promise.ts +69 -0
  273. package/src/utils/is_null_or_undefined.ts +1 -1
  274. package/src/utils/reference.ts +6 -0
  275. package/src/utils/request/xhr.ts +1 -1
  276. package/src/utils/task_canceller.ts +63 -34
  277. package/tsconfig.json +1 -1
  278. package/tsconfig.modules.json +1 -1
  279. package/dist/_esm5.processed/core/init/utils/media_duration_updater.d.ts +0 -56
  280. package/locked_reps.js +0 -46
  281. package/scripts/doc-generator/construct_table_of_contents.js +0 -76
  282. package/scripts/doc-generator/convert_MD_to_HMTL.js +0 -26
  283. package/scripts/doc-generator/create_documentation.js +0 -331
  284. package/scripts/doc-generator/create_documentation_page.js +0 -209
  285. package/scripts/doc-generator/create_page.js +0 -210
  286. package/scripts/doc-generator/generate_header_html.js +0 -147
  287. package/scripts/doc-generator/generate_page_html.js +0 -115
  288. package/scripts/doc-generator/generate_page_list_html.js +0 -92
  289. package/scripts/doc-generator/generate_sidebar_html.js +0 -85
  290. package/scripts/doc-generator/get_search_data_for_content.js +0 -137
  291. package/scripts/doc-generator/index.js +0 -34
  292. package/scripts/doc-generator/parse_doc_configs.js +0 -327
  293. package/scripts/doc-generator/scripts/lunr.js +0 -10
  294. package/scripts/doc-generator/scripts/script.js +0 -451
  295. package/scripts/doc-generator/styles/code.css +0 -99
  296. package/scripts/doc-generator/styles/style.css +0 -835
  297. package/scripts/doc-generator/utils.js +0 -74
@@ -1,210 +0,0 @@
1
- const { promisify } = require("util");
2
- const cheerio = require("cheerio");
3
- const fs = require("fs");
4
- const path = require("path");
5
- const buildSearchIndex = require("./build_search_index.js");
6
- const convertMDToHTML = require("./convert_MD_to_HMTL.js");
7
- const constructTableOfContents = require("./construct_table_of_contents.js");
8
- const constructHtml = require("./construct_html.js");
9
- const {
10
- mkdirParent,
11
- toUriCompatibleRelativePath,
12
- } = require("./utils.js");
13
-
14
- /**
15
- * Create and write HTML page output file from the markdown input file.
16
- * @param {Object} options
17
- * @returns {Promise}
18
- */
19
- module.exports = async function createDocumentationPage({
20
- // Absolute path to the root dir where all outputed files will be
21
- baseOutDir,
22
- // Relative CSS URIs on this page
23
- cssUris,
24
- // Absolute path to the file that should be converted
25
- inputFile,
26
- // Function translating links in Markdown files to an URL form to the right file
27
- linkTranslator,
28
- // HTML string for the navbar (the header on the top of the page)
29
- navBarHtml,
30
- // Information relative to the next documentation page, `null` if none.
31
- nextPageInfo,
32
- // Absolute path where the generated page should be generated.
33
- outputFile,
34
- // Title of the corresponding HTML page
35
- pageTitle,
36
- // Information relative to the previous documentation page, `null` if none.
37
- prevPageInfo,
38
- // Relative JS URIs on this page
39
- scriptUris,
40
- // Array corresponding to the complete search index.
41
- // It will be completed with data present in this file.
42
- searchIndex,
43
- // HTML string for the sidebar
44
- sidebarHtml,
45
- }) {
46
- const rootUrl = toUriCompatibleRelativePath(
47
- path.resolve(baseOutDir),
48
- path.dirname(outputFile)
49
- );
50
- const outputUrlFromRoot = toUriCompatibleRelativePath(outputFile, baseOutDir);
51
-
52
- const outputDir = path.dirname(outputFile);
53
- let data;
54
- try {
55
- data = await promisify(fs.readFile)(inputFile, "utf8");
56
- } catch (err) {
57
- /* eslint-disable no-console */
58
- console.error("error reading file:", err);
59
- /* eslint-enable no-console */
60
- return;
61
- }
62
- const inputDir = path.dirname(inputFile);
63
- const { content, tocMd, nbTocElements } = constructTableOfContents(data);
64
-
65
- let contentHtml = await parseMD(content, inputDir, outputDir, linkTranslator);
66
- const indexForFile = buildSearchIndex(contentHtml);
67
- searchIndex.push({
68
- file: outputUrlFromRoot,
69
- index: indexForFile,
70
- });
71
- contentHtml += constructNextPreviousPage(prevPageInfo, nextPageInfo);
72
-
73
- const tocHtml = nbTocElements > 1 ?
74
- generateTocbarHtml(tocMd) :
75
- "";
76
- const html = constructHtml({
77
- contentHtml,
78
- cssUris,
79
- navBarHtml,
80
- rootUrl,
81
- scriptUris,
82
- sidebarHtml,
83
- title: pageTitle,
84
- tocHtml,
85
- });
86
-
87
- try {
88
- await promisify(fs.writeFile)(outputFile, html);
89
- } catch (err) {
90
- /* eslint-disable no-console */
91
- console.error("error writing file:", err);
92
- /* eslint-enable no-console */
93
- return;
94
- }
95
- };
96
-
97
-
98
- async function updateMediaTag(mediaTag, inputDir, outputDir) {
99
- if (!mediaTag.attr("src")) {
100
- return;
101
- }
102
- const inputFile = path.join(inputDir, mediaTag.attr("src"));
103
- const outputFile = path.join(outputDir, mediaTag.attr("src"));
104
- if (await promisify(fs.exists)(outputFile)) {
105
- return;
106
- }
107
- const outDir = path.dirname(outputFile);
108
- const doesOutDirExists = await promisify(fs.exists)(outDir);
109
- if (!doesOutDirExists) {
110
- try {
111
- await mkdirParent(outDir);
112
- } catch (err) {
113
- const srcMessage = (err ?? {}).message ?? "Unknown error";
114
- console.error(`Error: Could not create "${outDir}" directory: ${srcMessage}`);
115
- process.exit(1);
116
- }
117
- }
118
- const doesOutFileExist = await promisify(fs.exists)(outputFile);
119
- if (!doesOutFileExist) {
120
- await promisify(fs.copyFile)(inputFile, outputFile);
121
- }
122
- }
123
-
124
- function constructNextPreviousPage(prevPageInfo, nextPageInfo) {
125
- if (prevPageInfo === null && nextPageInfo === null) {
126
- return "";
127
- }
128
-
129
- const prevPageElt = createNextPrevElt(prevPageInfo, false);
130
- const nextPageElt = createNextPrevElt(nextPageInfo, true);
131
- return `<nav class="next-previous-page-wrapper" aria-label="Navigate between pages">` +
132
- prevPageElt +
133
- nextPageElt +
134
- `</nav>`;
135
-
136
- function createNextPrevElt(pageInfo, isNext) {
137
- const base = `<div class="next-or-previous-page${isNext ? " next-page" : ""}">`;
138
- if (pageInfo === null) {
139
- return base + "</div>";
140
- }
141
- return base +
142
- `<a class="next-or-previous-page-link" href="${pageInfo.link}">` +
143
- `<div class="next-or-previous-page-link-label">` +
144
- (isNext ? "Next" : "Previous") +
145
- "</div>" +
146
- `<div class="next-or-previous-page-link-name">${pageInfo.name}</div>` +
147
- "</a></div>";
148
- }
149
- }
150
-
151
- /**
152
- * Convert Markdown to HTML.
153
- * @param {string} data - Markdown to convert
154
- * @param {string} inputDir - Directory the Markdown file is in.
155
- * Can be used to copy image/video/audio files.
156
- * @param {string} outputDir - Directory the HTML file will be in.
157
- * Can be used to copy image/video/audio files.
158
- * @param {Function|null|undefined} linkTranslator - Allow to translate links
159
- * from markdown to HTML. Is given the orginal link in the markdown and should
160
- * return the converted link.
161
- * If null or undefined, the links won't be converted.
162
- * @returns {string}
163
- */
164
- async function parseMD(data, inputDir, outputDir, linkTranslator) {
165
- // TODO I don't understand Cheerio/Jquery here, that's plain ugly
166
- // use markdown-it plugin instead?
167
- const $ = cheerio.load(convertMDToHTML(data));
168
-
169
- if (linkTranslator) {
170
- $("a").each((_, elem) => {
171
- const href = $(elem).attr("href");
172
- if (
173
- typeof href === "string" &&
174
- !/^(?:[a-z]+:)/.test(href) &&
175
- href[0] !== "#"
176
- ) {
177
- $(elem).attr("href", linkTranslator(href));
178
- }
179
- });
180
- }
181
-
182
- const imgTags = $("img").toArray();
183
- for (let i = 0; i < imgTags.length; i++) {
184
- await updateMediaTag($(imgTags[i]), inputDir, outputDir);
185
- }
186
- const audioTags = $("audio").toArray();
187
- for (let i = 0; i < audioTags.length; i++) {
188
- await updateMediaTag($(audioTags[i]), inputDir, outputDir);
189
- }
190
- const videoTags = $("video").toArray();
191
- for (let i = 0; i < videoTags.length; i++) {
192
- await updateMediaTag($(videoTags[i]), inputDir, outputDir);
193
- }
194
- return $.html();
195
- }
196
-
197
- /**
198
- * Construct the table of contents part of the HTML page, containing various
199
- * links to the current documentation page.
200
- * @param {string} toc - Markdown for the table of contents under a list form.
201
- * @returns {string} - sidebar div tag
202
- */
203
- function generateTocbarHtml(tocMd) {
204
- const tocHtml = convertMDToHTML(tocMd);
205
- return "<div class=\"tocbar-wrapper\">" +
206
- "<div class=\"tocbar\">" +
207
- tocHtml +
208
- "</div>" +
209
- "</div>";
210
- }
@@ -1,147 +0,0 @@
1
- const path = require("path");
2
- const { encode } = require("html-entities");
3
- const {
4
- toUriCompatibleRelativePath,
5
- getGithubSvg,
6
- } = require("./utils");
7
-
8
- /**
9
- * Construct HTML element, as a string, which corresponds to the header for
10
- * the chosen documentation page.
11
- * @param {Object} config
12
- * @param {number} currentLinkIdx
13
- * @param {string} currentPath
14
- * @param {object} logoInfo
15
- * @returns {string}
16
- */
17
- function generateHeaderHtml(config, currentLinkIdx, currentPath, logoInfo) {
18
- const { versionInfo, links, linksRightIndex } = config;
19
- const hamburgerHtml = constructHamburgerMenuHtmlInHeaderBar();
20
- const logoHtml = constructLogoHtmlInHeaderBar(logoInfo);
21
- const currentDir = path.dirname(currentPath);
22
-
23
- const linksHtml = links.map((l, i) => {
24
- const customClass =
25
- i === linksRightIndex ? " first-right" :
26
- i === linksRightIndex - 1 ? " last-left" :
27
- "";
28
- switch (l.type) {
29
- case "local-doc": {
30
- const relativeUri = toUriCompatibleRelativePath(l.firstPage, currentDir);
31
- const activeClass = i === currentLinkIdx ? " navbar-active" : "";
32
- const cleanedHref = encode(relativeUri);
33
- return `<a class="navbar-item${activeClass}${customClass} hideable"` +
34
- `href="${cleanedHref}">${encode(l.displayName)}</a>`;
35
- }
36
- case "external-link": {
37
- const cleanedHref = encode(l.link);
38
- return `<a class="navbar-item${customClass} hideable"` +
39
- `href="${cleanedHref}">${encode(l.displayName)}</a>`;
40
- }
41
- case "github-link":
42
- return constructGithubLinkHtmlInHeaderBar(l.link, customClass);
43
- case "search":
44
- return constructSearchHtmlInHeaderBar(customClass);
45
- case "version":
46
- return constructVersionLinkHtmlInHeaderBar(versionInfo, customClass);
47
- }
48
- }).join("\n");
49
- return `<nav class="navbar-parent">` +
50
- `<div class="navbar-wrapper">` +
51
- `<div class="navbar-items">` +
52
- hamburgerHtml +
53
- logoHtml +
54
- linksHtml +
55
- "</div></div> </nav>";
56
- }
57
-
58
- function constructHamburgerMenuHtmlInHeaderBar() {
59
- return `<button aria-label="Open website index" class="hamburger-opener">` +
60
- `<svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true">` +
61
- `<path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" ` +
62
- `stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg>` +
63
- "</button>";
64
- }
65
-
66
- /**
67
- * Returns the HTML string corresponding to the current version number, if
68
- * available, and with the corresponding link, also if available.
69
- * @param {Object} versionInfo
70
- * @param {string} customClass
71
- * @returns {string}
72
- */
73
- function constructVersionLinkHtmlInHeaderBar(versionInfo, customClass) {
74
- if (
75
- versionInfo === undefined || versionInfo === null ||
76
- typeof versionInfo.version !== "string"
77
- ) {
78
- return "";
79
- }
80
- let element = "";
81
- let hasLink = false;
82
- const { version } = versionInfo;
83
- if (typeof versionInfo.link === "string") {
84
- hasLink = true;
85
- element += `<a class="navbar-item${customClass}"` +
86
- `href="${encode(versionInfo.link)}">`;
87
- } else {
88
- element += `<span class="navbar-item${customClass}">`;
89
- }
90
- element += `<span class="version-item">version: ${encode(version)}</span>`;
91
- element += hasLink ? "</a>" : "</span>";
92
- return element;
93
- }
94
-
95
- /**
96
- * Returns the HTML string corresponding to the link to the github repository,
97
- * through a SVG representing Github's logo.
98
- * @param {string} githubLnk
99
- * @param {string} customClass
100
- * @returns {string}
101
- */
102
- function constructGithubLinkHtmlInHeaderBar(githubLnk, customClass) {
103
- const cleanedHref = encode(githubLnk);
104
- return `<a aria-label="Link to repository" class="navbar-item${customClass} hideable" href="${cleanedHref}">` +
105
- getGithubSvg() +
106
- "</a>";
107
- }
108
-
109
- function constructSearchHtmlInHeaderBar(customClass) {
110
- return `<span class="navbar-item search-icon${customClass}">` +
111
- `<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" ` +
112
- `viewBox="0 0 20 20">` +
113
- `<title>search</title>` +
114
- `<path d="M19 17l-5.15-5.15a7 7 0 1 0-2 2L17 19zM3.5 8A4.5 4.5 ` +
115
- `0 1 1 8 12.5 4.5 4.5 0 0 1 3.5 8z"/>` +
116
- `<script xmlns=""/></svg>` +
117
- `</span>`;
118
- }
119
-
120
- /**
121
- * Returns the HTML string corresponding to the logo of the current project, if
122
- * available, and with the corresponding link, also if available.
123
- * @param {Object|undefined} logoInfo
124
- * @returns {string}
125
- */
126
- function constructLogoHtmlInHeaderBar(logoInfo) {
127
- if (logoInfo === null || logoInfo === undefined) {
128
- return "";
129
- }
130
-
131
- let logoHtml = "";
132
- let hasLink = false;
133
- if (typeof logoInfo.link === "string") {
134
- hasLink = true;
135
- logoHtml += `<a href="${encode(logoInfo.link)}">`;
136
- }
137
- if (typeof logoInfo.url === "string") {
138
- logoHtml += `<img alt="Logo" class="navbar-item navbar-item-logo"` +
139
- ` src="${encode(logoInfo.url)}" />`;
140
- }
141
- if (hasLink) {
142
- logoHtml += "</a>";
143
- }
144
- return logoHtml;
145
- }
146
-
147
- module.exports = generateHeaderHtml;
@@ -1,115 +0,0 @@
1
- const { encode } = require("html-entities");
2
-
3
- /**
4
- * Generate HTML page for the given documentation.
5
- * @param {Object} args
6
- * @param {string} args.contentHtml - HTML content for the content of the
7
- * @param {Array.<string>} args.cssUrls - URLs to the CSS files that should
8
- * be imported.
9
- * @param {string|null|undefined} [args.faviconUrl] - Eventual URL to the
10
- * favicon.
11
- * `null` or `undefined` if unset.
12
- * @param {string} options.navBarHtml - HTML strinng for the Navbar (the
13
- * header).
14
- * @param {string} options.pageListHtml - HTML string for the complete list of
15
- * documentation pages with links.
16
- * @param {string} options.rootUrl - Relative URL for the root of the site.
17
- * This value is included in a custom script so it can be accessed from other
18
- * JavaScript files.
19
- * @param {Array.<string>} args.scriptUrls - URLs to the JS files that should
20
- * be imported.
21
- * @param {string} options.sidebarHtml - HTML string for the Sidebar.
22
- * @param {string} args.title - title of the page.
23
- * @param {string} options.tocHtml - HTML string for the Table of content.
24
- * `undefined` if your page has no table of contents.
25
- * @returns {string} - Whole HTML string for the documentation page.
26
- */
27
- function generatePageHtml(
28
- {
29
- contentHtml,
30
- cssUrls,
31
- faviconUrl,
32
- navBarHtml,
33
- pageListHtml,
34
- rootUrl,
35
- scriptUrls,
36
- sidebarHtml,
37
- title,
38
- tocHtml,
39
- }
40
- ) {
41
- const styles = constructStylesHtml(cssUrls);
42
- const scripts = constructScriptsHtml(scriptUrls);
43
- const faviconHtml = typeof faviconUrl === "string" ?
44
- `<link rel="icon" type="image/png" href="${encode(faviconUrl)}">` :
45
- "";
46
- const hamburgerHtml = constructHamburgerBarHtml(pageListHtml);
47
-
48
- return "<!DOCTYPE html><html lang=\"en\"><head>" +
49
- "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">" +
50
- "<meta charset=\"utf-8\">" +
51
- styles +
52
- "<title>" + encode(title) + "</title>" +
53
- faviconHtml +
54
- "</head>" +
55
- "<body class=\"no-js\">" +
56
- `<script type="text/javascript">` +
57
- `document.body.className = "";` +
58
- `window.rootUrl = "${rootUrl}";` +
59
- "</script>" +
60
- "<div class=\"page-wrapper\">" +
61
- navBarHtml +
62
- sidebarHtml +
63
- "<div class=\"content-wrapper\">" +
64
- "<div class=\"content\">" +
65
- `<div id="search-wrapper">` +
66
- `<input type="search" name="search" id="searchbar" ` +
67
- `placeholder="Search in this documentation" class="active" />` +
68
- `<div id="search-results"></div>` +
69
- `</div>` +
70
- contentHtml +
71
- `</div>` +
72
- tocHtml +
73
- "</div>" +
74
- "</div>" +
75
- hamburgerHtml +
76
- scripts +
77
- "</body></html>";
78
- };
79
-
80
- function constructHamburgerBarHtml(pageListHtml) {
81
- return `<div class="hamburger-bar">` +
82
- `<div class="hamburger-header">` +
83
- `<span class="hamburger-title">Page List</span>` +
84
- `<button aria-label="Close website index" type="button" class="hamburger-bar-closer">` +
85
- `<svg viewBox="0 0 15 15" width="21" height="21">` +
86
- `<g stroke="black" stroke-width="1.2"><path d="M.75.75l13.5 13.5M14.25.75L.75 14.25"></path></g>` +
87
- `</svg></button>` +
88
- `</div>` +
89
- pageListHtml +
90
- "</div>";
91
- }
92
-
93
- /**
94
- * Returns links to CSS file as an HTML string to be included in the page.
95
- * @param {Array.<string>} cssUrls - URL to CSS files
96
- * @returns {string}
97
- */
98
- function constructStylesHtml(cssUrls) {
99
- return cssUrls.map(cssUrl =>
100
- `<link rel="stylesheet" href="${encode(cssUrl)}"/>`)
101
- .join("");
102
- }
103
-
104
- /**
105
- * @param {Array.<string>} scriptUrls - URL to scripts files
106
- * @returns {string}
107
- */
108
- function constructScriptsHtml(scriptUrls) {
109
- return scriptUrls.map(scriptUrl =>
110
- `<script type="text/javascript" src="${encode(scriptUrl)}" ` +
111
- `charset="utf-8"></script>`
112
- ).join("");
113
- }
114
-
115
- module.exports = generatePageHtml;
@@ -1,92 +0,0 @@
1
- const { encode } = require("html-entities");
2
- const path = require("path");
3
- const {
4
- getGithubSvg,
5
- toUriCompatibleRelativePath,
6
- } = require("./utils");
7
-
8
- /**
9
- * Construct exhaustive list of documentation links as an HTML string.
10
- * @param {Array.<Object>} links
11
- * @param {number} currentLinkIdx
12
- * @param {Array.<number>} currentPageIndexes
13
- * @param {string} currentPath
14
- * @returns {string}
15
- */
16
- function generatePageListHtml(
17
- links,
18
- currentLinkIdx,
19
- currentPageIndexes,
20
- currentPath
21
- ) {
22
- const currentDir = path.dirname(currentPath);
23
- const linksHtml = links.map((l, linkIdx) => {
24
- switch (l.type) {
25
- case "local-doc": {
26
- const isActiveCat = linkIdx === currentLinkIdx;
27
- const catActiveClasses = isActiveCat ? " opened active" : "";
28
-
29
- const catHtml = `<li class="page-list-item">` +
30
- `<div class="page-list-group${catActiveClasses}">` +
31
- encode(l.displayName) +
32
- `</div><ul class="page-list-cat-group">`;
33
-
34
- return catHtml + l.pages.map((currentPage, pageidx) => {
35
- const isPageActive = isActiveCat && pageidx === currentPageIndexes[0];
36
- const { displayName, outputFile } = currentPage;
37
- if (!currentPage.isPageGroup) {
38
- const pageActiveClasses = isPageActive ? " active" : "";
39
- const relativeUri = toUriCompatibleRelativePath(outputFile, currentDir);
40
- return `<li class="page-list-item${pageActiveClasses}">` +
41
- `<a href="${encode(relativeUri)}">` +
42
- encode(displayName) +
43
- `</a></li>`;
44
- }
45
- const pageActiveClasses = isPageActive ? " opened active" : "";
46
- const pageGroupHtml = `<li>` +
47
- `<div class="page-list-item page-list-group${pageActiveClasses}">` +
48
- encode(displayName) +
49
- `</div><ul class="page-list-group-group">`;
50
- return pageGroupHtml + currentPage.pages.map((currentSubPage, spIdx) => {
51
- const spActiveClasses = isPageActive && spIdx === currentPageIndexes[1] ?
52
- " active" : "";
53
- const { displayName, outputFile } = currentSubPage;
54
- const relativeUri = toUriCompatibleRelativePath(outputFile, currentDir);
55
- return `<li class="page-list-item${spActiveClasses}">` +
56
- `<a href="${encode(relativeUri)}">` +
57
- encode(displayName) +
58
- `</a></li>`;
59
- }).join("\n") + "</ul></li>";
60
- }).join("\n") + "</ul></li>";
61
- }
62
-
63
- case "external-link": {
64
- const cleanedHref = encode(l.link);
65
- return `<li class="page-list-item">` +
66
- `<a href="${cleanedHref}">` +
67
- encode(l.displayName) +
68
- "</a></li>";
69
- }
70
-
71
- case "github-link":
72
- const cleanedHref = encode(l.link);
73
- return `<li class="page-list-item">` +
74
- `<a aria-label="Link to repository" href="${cleanedHref}">` +
75
- getGithubSvg() +
76
- "</a></li>";
77
-
78
- case "search":
79
- return "";
80
-
81
- case "version":
82
- // TODO?
83
- return "";
84
- }
85
- }).join("\n");
86
-
87
- return `<ul class="page-list-wrapper">` +
88
- linksHtml +
89
- "</ul>";
90
- };
91
-
92
- module.exports = generatePageListHtml;
@@ -1,85 +0,0 @@
1
- const path = require("path");
2
- const { encode } = require("html-entities");
3
- const { toUriCompatibleRelativePath } = require("./utils");
4
-
5
- /**
6
- * Construct HTML element, as a string, which corresponds to the sidebar for
7
- * the chosen documentation page.
8
- * @param {Array.<Object>} pages
9
- * @param {Array.<number>} currentPageIndexes
10
- * @param {string} currentPath
11
- * @param {Object} logoInfo
12
- * @returns {string}
13
- */
14
- function generateSidebarHtml(
15
- pages,
16
- currentPageIndexes,
17
- currentPath,
18
- logoInfo
19
- ) {
20
- const sidebarHeaderHtml = constructSidebarHeaderHtml(logoInfo);
21
- const links = pages.map((p, i) => {
22
- const isActive = i === currentPageIndexes[0];
23
- if (!p.isPageGroup) {
24
- return generateLiForPage(p, isActive);
25
- } else {
26
- const lis = p.pages.map((sp, j) => {
27
- const isActiveSubPage = isActive && j === currentPageIndexes[1];
28
- return generateLiForPage(sp, isActiveSubPage);
29
- }).join("");
30
- return `<li class="sidebar-item">` +
31
- `<div class="sidebar-item sidebar-item-group${isActive ? " active opened" : ""}">` +
32
- encode(p.displayName) +
33
- "</div>" +
34
- `<ul>${lis}</ul>` +
35
- "</li>";
36
-
37
- }
38
- }).join("");
39
- return `<aside class="sidebar-parent">` +
40
- sidebarHeaderHtml +
41
- `<div class="sidebar-wrapper">` +
42
- `<div class="sidebar-items">${links}</div>` +
43
- "</div>" +
44
- "</aside>";
45
-
46
- function generateLiForPage(p, isActive) {
47
- const relativeUri = toUriCompatibleRelativePath(
48
- p.outputFile,
49
- path.dirname(currentPath)
50
- );
51
- const activeClass = isActive ? " active" : "";
52
- const cleanedHref = encode(relativeUri);
53
- return "<li class=\"sidebar-item\">" +
54
- `<a class="sidebar-link${activeClass}" href="` +
55
- cleanedHref +
56
- `">${encode(p.displayName)}</a>` +
57
- "</li>";
58
- }
59
- }
60
-
61
- /**
62
- * @param {Object} logoInfo
63
- * @returns {string}
64
- */
65
- function constructSidebarHeaderHtml(logoInfo) {
66
- let sidebarHeaderHtml = `<div class="sidebar-header">`;
67
- if (logoInfo !== undefined) {
68
- let hasLink = false;
69
- if (typeof logoInfo.link === "string") {
70
- hasLink = true;
71
- sidebarHeaderHtml += `<a href="${encode(logoInfo.link)}">`;
72
- }
73
- if (typeof logoInfo.url === "string") {
74
- sidebarHeaderHtml += `<img alt="logo" class="sidebar-header-logo"` +
75
- ` src="${encode(logoInfo.url)}" />`;
76
- }
77
- if (hasLink) {
78
- sidebarHeaderHtml += "</a>";
79
- }
80
- }
81
- sidebarHeaderHtml += `</div>`;
82
- return sidebarHeaderHtml;
83
- }
84
-
85
- module.exports = generateSidebarHtml;