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.
- package/.eslintrc.js +8 -0
- package/CHANGELOG.md +93 -0
- package/CONTRIBUTING.md +48 -168
- package/FILES.md +40 -92
- package/VERSION +1 -1
- package/dist/_esm5.processed/compat/browser_detection.d.ts +25 -12
- package/dist/_esm5.processed/compat/browser_detection.js +85 -38
- package/dist/_esm5.processed/compat/can_reuse_media_keys.js +2 -2
- package/dist/_esm5.processed/compat/eme/close_session.js +2 -2
- package/dist/_esm5.processed/compat/eme/load_session.js +1 -1
- package/dist/_esm5.processed/compat/event_listeners.js +1 -1
- package/dist/_esm5.processed/compat/has_issues_with_high_media_source_duration.d.ts +21 -0
- package/dist/_esm5.processed/compat/has_issues_with_high_media_source_duration.js +26 -0
- package/dist/_esm5.processed/config.d.ts +4 -0
- package/dist/_esm5.processed/core/adaptive/adaptive_representation_selector.js +9 -6
- package/dist/_esm5.processed/core/adaptive/buffer_based_chooser.d.ts +18 -1
- package/dist/_esm5.processed/core/adaptive/buffer_based_chooser.js +106 -25
- package/dist/_esm5.processed/core/adaptive/guess_based_chooser.js +6 -6
- package/dist/_esm5.processed/core/adaptive/network_analyzer.js +8 -5
- package/dist/_esm5.processed/core/adaptive/utils/representation_score_calculator.d.ts +19 -1
- package/dist/_esm5.processed/core/adaptive/utils/representation_score_calculator.js +1 -1
- package/dist/_esm5.processed/core/api/debug/buffer_graph.d.ts +28 -0
- package/dist/_esm5.processed/core/api/debug/buffer_graph.js +175 -0
- package/dist/_esm5.processed/core/api/debug/buffer_size_graph.d.ts +10 -0
- package/dist/_esm5.processed/core/api/debug/buffer_size_graph.js +104 -0
- package/dist/_esm5.processed/core/api/debug/constants.d.ts +2 -0
- package/dist/_esm5.processed/core/api/debug/constants.js +2 -0
- package/dist/_esm5.processed/core/api/debug/index.d.ts +2 -0
- package/dist/_esm5.processed/core/api/debug/index.js +2 -0
- package/dist/_esm5.processed/core/api/debug/modules/general_info.d.ts +3 -0
- package/dist/_esm5.processed/core/api/debug/modules/general_info.js +180 -0
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.d.ts +4 -0
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_content.js +121 -0
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.d.ts +3 -0
- package/dist/_esm5.processed/core/api/debug/modules/segment_buffer_size.js +35 -0
- package/dist/_esm5.processed/core/api/debug/render.d.ts +3 -0
- package/dist/_esm5.processed/core/api/debug/render.js +32 -0
- package/dist/_esm5.processed/core/api/debug/utils.d.ts +39 -0
- package/dist/_esm5.processed/core/api/debug/utils.js +57 -0
- package/dist/_esm5.processed/core/api/playback_observer.js +4 -2
- package/dist/_esm5.processed/core/api/public_api.d.ts +60 -3
- package/dist/_esm5.processed/core/api/public_api.js +280 -60
- package/dist/_esm5.processed/core/api/track_management/media_element_tracks_store.js +10 -1
- package/dist/_esm5.processed/core/api/track_management/track_dispatcher.d.ts +13 -1
- package/dist/_esm5.processed/core/api/track_management/track_dispatcher.js +30 -15
- package/dist/_esm5.processed/core/api/track_management/tracks_store.d.ts +3 -1
- package/dist/_esm5.processed/core/api/track_management/tracks_store.js +67 -152
- package/dist/_esm5.processed/core/api/utils.d.ts +10 -0
- package/dist/_esm5.processed/core/api/utils.js +23 -3
- package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.d.ts +27 -8
- package/dist/_esm5.processed/core/decrypt/__tests__/__global__/utils.js +28 -7
- package/dist/_esm5.processed/core/decrypt/attach_media_keys.js +1 -1
- package/dist/_esm5.processed/core/decrypt/content_decryptor.js +1 -1
- package/dist/_esm5.processed/core/decrypt/find_key_system.js +29 -6
- package/dist/_esm5.processed/core/decrypt/session_events_listener.js +42 -32
- package/dist/_esm5.processed/core/decrypt/utils/check_key_statuses.js +4 -0
- package/dist/_esm5.processed/core/decrypt/utils/clean_old_loaded_sessions.js +2 -0
- package/dist/_esm5.processed/core/decrypt/utils/loaded_sessions_store.js +5 -1
- package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.d.ts +17 -8
- package/dist/_esm5.processed/core/fetchers/cdn_prioritizer.js +10 -6
- package/dist/_esm5.processed/core/fetchers/manifest/manifest_fetcher.js +5 -4
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.d.ts +22 -5
- package/dist/_esm5.processed/core/fetchers/segment/segment_fetcher.js +37 -21
- package/dist/_esm5.processed/core/fetchers/segment/task_prioritizer.js +21 -23
- package/dist/_esm5.processed/core/fetchers/utils/schedule_request.js +17 -7
- package/dist/_esm5.processed/core/init/directfile_content_initializer.js +2 -2
- package/dist/_esm5.processed/core/init/media_source_content_initializer.js +74 -41
- package/dist/_esm5.processed/core/init/types.d.ts +9 -1
- package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.d.ts +28 -1
- package/dist/_esm5.processed/core/init/utils/content_time_boundaries_observer.js +24 -11
- package/dist/_esm5.processed/core/init/utils/create_media_source.js +3 -12
- package/dist/_esm5.processed/core/init/utils/end_of_stream.js +6 -3
- package/dist/_esm5.processed/core/init/utils/get_loaded_reference.js +2 -1
- package/dist/_esm5.processed/core/init/utils/initial_seek_and_play.js +9 -5
- package/dist/_esm5.processed/core/init/utils/initialize_content_decryption.js +2 -1
- package/dist/_esm5.processed/core/init/utils/media_source_duration_updater.d.ts +58 -0
- package/dist/_esm5.processed/core/init/utils/{media_duration_updater.js → media_source_duration_updater.js} +87 -86
- package/dist/_esm5.processed/core/init/utils/rebuffering_controller.d.ts +36 -2
- package/dist/_esm5.processed/core/init/utils/rebuffering_controller.js +83 -3
- package/dist/_esm5.processed/core/init/utils/stream_events_emitter/stream_events_emitter.js +6 -4
- package/dist/_esm5.processed/core/init/utils/throw_on_media_error.js +1 -1
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.d.ts +18 -7
- package/dist/_esm5.processed/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.js +38 -50
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.d.ts +8 -0
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/html/html_text_segment_buffer.js +16 -2
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.d.ts +8 -0
- package/dist/_esm5.processed/core/segment_buffers/implementations/text/native/native_text_segment_buffer.js +12 -0
- package/dist/_esm5.processed/core/segment_buffers/implementations/types.d.ts +11 -4
- package/dist/_esm5.processed/core/segment_buffers/index.d.ts +2 -2
- package/dist/_esm5.processed/core/segment_buffers/segment_buffers_store.js +13 -9
- package/dist/_esm5.processed/core/stream/adaptation/adaptation_stream.js +30 -16
- package/dist/_esm5.processed/core/stream/adaptation/utils/create_representation_estimator.d.ts +47 -0
- package/dist/_esm5.processed/core/stream/adaptation/utils/create_representation_estimator.js +70 -0
- package/dist/_esm5.processed/core/stream/orchestrator/stream_orchestrator.js +41 -20
- package/dist/_esm5.processed/core/stream/period/period_stream.js +12 -11
- package/dist/_esm5.processed/core/stream/representation/representation_stream.js +37 -28
- package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.d.ts +4 -2
- package/dist/_esm5.processed/core/stream/representation/utils/append_segment_to_buffer.js +3 -3
- package/dist/_esm5.processed/core/stream/representation/utils/downloading_queue.js +16 -6
- package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.d.ts +3 -2
- package/dist/_esm5.processed/core/stream/representation/utils/push_init_segment.js +8 -8
- package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.d.ts +2 -2
- package/dist/_esm5.processed/core/stream/representation/utils/push_media_segment.js +2 -3
- package/dist/_esm5.processed/core/stream/utils/create_reload_request.js +1 -1
- package/dist/_esm5.processed/default_config.d.ts +41 -0
- package/dist/_esm5.processed/default_config.js +46 -2
- package/dist/_esm5.processed/errors/index.d.ts +2 -2
- package/dist/_esm5.processed/errors/media_error.d.ts +23 -1
- package/dist/_esm5.processed/errors/media_error.js +18 -5
- package/dist/_esm5.processed/experimental/features/debug_element.d.ts +8 -0
- package/dist/_esm5.processed/experimental/features/debug_element.js +10 -0
- package/dist/_esm5.processed/experimental/features/index.d.ts +1 -0
- package/dist/_esm5.processed/experimental/features/index.js +1 -0
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_and_push_segment.d.ts +1 -1
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/load_and_push_segment.js +8 -7
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.js +7 -4
- package/dist/_esm5.processed/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.js +24 -12
- package/dist/_esm5.processed/experimental/tools/mediaCapabilitiesProber/index.js +0 -2
- package/dist/_esm5.processed/features/features_object.js +1 -0
- package/dist/_esm5.processed/features/initialize_features.js +13 -10
- package/dist/_esm5.processed/features/types.d.ts +3 -0
- package/dist/_esm5.processed/manifest/adaptation.d.ts +21 -2
- package/dist/_esm5.processed/manifest/adaptation.js +80 -1
- package/dist/_esm5.processed/manifest/manifest.js +2 -0
- package/dist/_esm5.processed/manifest/period.js +2 -2
- package/dist/_esm5.processed/manifest/representation.d.ts +33 -2
- package/dist/_esm5.processed/manifest/representation.js +32 -4
- package/dist/_esm5.processed/manifest/utils.js +1 -3
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_adaptation_sets.js +105 -137
- package/dist/_esm5.processed/parsers/manifest/dash/common/parse_representations.js +25 -5
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.d.ts +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/js-parser/parse_from_document.js +1 -1
- package/dist/_esm5.processed/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.js +1 -0
- package/dist/_esm5.processed/public_types.d.ts +13 -3
- package/dist/_esm5.processed/tools/TextTrackRenderer/text_track_renderer.js +1 -1
- package/dist/_esm5.processed/transports/dash/add_segment_integrity_checks_to_loader.js +15 -11
- package/dist/_esm5.processed/transports/dash/low_latency_segment_loader.js +2 -2
- package/dist/_esm5.processed/transports/dash/manifest_parser.js +1 -1
- package/dist/_esm5.processed/transports/dash/segment_loader.js +4 -4
- package/dist/_esm5.processed/transports/local/segment_loader.js +13 -26
- package/dist/_esm5.processed/transports/smooth/isobmff/create_boxes.d.ts +4 -6
- package/dist/_esm5.processed/transports/smooth/isobmff/create_boxes.js +4 -6
- package/dist/_esm5.processed/transports/smooth/segment_loader.js +4 -4
- package/dist/_esm5.processed/transports/utils/call_custom_manifest_loader.js +3 -3
- package/dist/_esm5.processed/utils/cancellable_sleep.js +4 -10
- package/dist/_esm5.processed/utils/create_cancellable_promise.d.ts +26 -0
- package/dist/_esm5.processed/utils/create_cancellable_promise.js +52 -0
- package/dist/_esm5.processed/utils/is_null_or_undefined.d.ts +1 -1
- package/dist/_esm5.processed/utils/is_null_or_undefined.js +1 -1
- package/dist/_esm5.processed/utils/reference.js +6 -0
- package/dist/_esm5.processed/utils/request/xhr.js +1 -1
- package/dist/_esm5.processed/utils/task_canceller.d.ts +34 -15
- package/dist/_esm5.processed/utils/task_canceller.js +55 -22
- package/dist/mpd-parser.wasm +0 -0
- package/dist/rx-player.js +5424 -4712
- package/dist/rx-player.min.js +1 -1
- package/jest.config.js +1 -5
- package/package.json +44 -40
- package/scripts/build/constants.d.ts +1 -0
- package/scripts/build/generate_build.js +1 -1
- package/scripts/fast_demo_build.js +40 -40
- package/scripts/generate_full_demo.js +1 -1
- package/sonar-project.properties +1 -1
- package/src/compat/browser_detection.ts +105 -52
- package/src/compat/can_reuse_media_keys.ts +5 -2
- package/src/compat/eme/close_session.ts +2 -2
- package/src/compat/eme/load_session.ts +1 -1
- package/src/compat/event_listeners.ts +1 -1
- package/src/compat/has_issues_with_high_media_source_duration.ts +27 -0
- package/src/core/adaptive/__tests__/buffer_based_chooser.test.ts +147 -48
- package/src/core/adaptive/adaptive_representation_selector.ts +11 -6
- package/src/core/adaptive/buffer_based_chooser.ts +144 -26
- package/src/core/adaptive/guess_based_chooser.ts +9 -8
- package/src/core/adaptive/network_analyzer.ts +9 -4
- package/src/core/adaptive/utils/representation_score_calculator.ts +22 -2
- package/src/core/api/debug/buffer_graph.ts +247 -0
- package/src/core/api/debug/buffer_size_graph.ts +130 -0
- package/src/core/api/debug/constants.ts +2 -0
- package/src/core/api/debug/index.ts +3 -0
- package/src/core/api/debug/modules/general_info.ts +184 -0
- package/src/core/api/debug/modules/segment_buffer_content.ts +155 -0
- package/src/core/api/debug/modules/segment_buffer_size.ts +48 -0
- package/src/core/api/debug/render.ts +40 -0
- package/src/core/api/debug/utils.ts +103 -0
- package/src/core/api/playback_observer.ts +5 -2
- package/src/core/api/public_api.ts +334 -73
- package/src/core/api/track_management/media_element_tracks_store.ts +17 -8
- package/src/core/api/track_management/track_dispatcher.ts +37 -14
- package/src/core/api/track_management/tracks_store.ts +77 -167
- package/src/core/api/utils.ts +29 -3
- package/src/core/decrypt/__tests__/__global__/utils.ts +61 -40
- package/src/core/decrypt/attach_media_keys.ts +1 -1
- package/src/core/decrypt/content_decryptor.ts +1 -1
- package/src/core/decrypt/find_key_system.ts +25 -11
- package/src/core/decrypt/session_events_listener.ts +45 -39
- package/src/core/decrypt/utils/check_key_statuses.ts +6 -0
- package/src/core/decrypt/utils/clean_old_loaded_sessions.ts +2 -1
- package/src/core/decrypt/utils/loaded_sessions_store.ts +8 -1
- package/src/core/fetchers/cdn_prioritizer.ts +18 -9
- package/src/core/fetchers/manifest/manifest_fetcher.ts +5 -4
- package/src/core/fetchers/segment/segment_fetcher.ts +36 -14
- package/src/core/fetchers/segment/task_prioritizer.ts +25 -30
- package/src/core/fetchers/utils/schedule_request.ts +18 -7
- package/src/core/init/directfile_content_initializer.ts +2 -1
- package/src/core/init/media_source_content_initializer.ts +89 -50
- package/src/core/init/types.ts +9 -1
- package/src/core/init/utils/content_time_boundaries_observer.ts +48 -12
- package/src/core/init/utils/create_media_source.ts +4 -16
- package/src/core/init/utils/end_of_stream.ts +6 -3
- package/src/core/init/utils/get_loaded_reference.ts +2 -1
- package/src/core/init/utils/initial_seek_and_play.ts +9 -5
- package/src/core/init/utils/initialize_content_decryption.ts +2 -1
- package/src/core/init/utils/{media_duration_updater.ts → media_source_duration_updater.ts} +103 -110
- package/src/core/init/utils/rebuffering_controller.ts +115 -4
- package/src/core/init/utils/stream_events_emitter/stream_events_emitter.ts +6 -4
- package/src/core/init/utils/throw_on_media_error.ts +1 -1
- package/src/core/segment_buffers/implementations/audio_video/audio_video_segment_buffer.ts +63 -66
- package/src/core/segment_buffers/implementations/text/html/html_text_segment_buffer.ts +20 -2
- package/src/core/segment_buffers/implementations/text/native/native_text_segment_buffer.ts +16 -0
- package/src/core/segment_buffers/implementations/types.ts +16 -4
- package/src/core/segment_buffers/index.ts +2 -0
- package/src/core/segment_buffers/segment_buffers_store.ts +16 -13
- package/src/core/stream/adaptation/adaptation_stream.ts +33 -19
- package/src/core/stream/adaptation/utils/create_representation_estimator.ts +114 -0
- package/src/core/stream/orchestrator/stream_orchestrator.ts +42 -20
- package/src/core/stream/period/period_stream.ts +13 -11
- package/src/core/stream/representation/representation_stream.ts +49 -37
- package/src/core/stream/representation/utils/append_segment_to_buffer.ts +9 -4
- package/src/core/stream/representation/utils/downloading_queue.ts +16 -4
- package/src/core/stream/representation/utils/push_init_segment.ts +11 -6
- package/src/core/stream/representation/utils/push_media_segment.ts +3 -3
- package/src/core/stream/utils/create_reload_request.ts +1 -1
- package/src/default_config.ts +59 -11
- package/src/errors/__tests__/media_error.test.ts +6 -6
- package/src/errors/index.ts +4 -1
- package/src/errors/media_error.ts +67 -1
- package/src/experimental/features/__tests__/debug_element.test.ts +26 -0
- package/src/experimental/features/debug_element.ts +13 -0
- package/src/experimental/features/index.ts +1 -0
- package/src/experimental/tools/VideoThumbnailLoader/load_and_push_segment.ts +10 -7
- package/src/experimental/tools/VideoThumbnailLoader/prepare_source_buffer.ts +7 -4
- package/src/experimental/tools/VideoThumbnailLoader/video_thumbnail_loader.ts +25 -10
- package/src/experimental/tools/mediaCapabilitiesProber/index.ts +0 -4
- package/src/features/__tests__/initialize_features.test.ts +11 -0
- package/src/features/features_object.ts +1 -0
- package/src/features/initialize_features.ts +15 -10
- package/src/features/types.ts +9 -0
- package/src/manifest/__tests__/manifest.test.ts +7 -7
- package/src/manifest/__tests__/period.test.ts +90 -45
- package/src/manifest/adaptation.ts +96 -1
- package/src/manifest/manifest.ts +4 -0
- package/src/manifest/period.ts +4 -2
- package/src/manifest/representation.ts +77 -5
- package/src/manifest/utils.ts +1 -3
- package/src/parsers/manifest/dash/common/parse_adaptation_sets.ts +116 -151
- package/src/parsers/manifest/dash/common/parse_representations.ts +21 -4
- package/src/parsers/manifest/dash/js-parser/parse_from_document.ts +1 -1
- package/src/parsers/manifest/dash/wasm-parser/ts/dash-wasm-parser.ts +1 -0
- package/src/parsers/texttracks/ttml/parse_ttml.ts +1 -1
- package/src/public_types.ts +16 -1
- package/src/tools/TextTrackRenderer/text_track_renderer.ts +1 -1
- package/src/transports/dash/add_segment_integrity_checks_to_loader.ts +31 -22
- package/src/transports/dash/low_latency_segment_loader.ts +2 -2
- package/src/transports/dash/manifest_parser.ts +1 -1
- package/src/transports/dash/segment_loader.ts +4 -4
- package/src/transports/local/segment_loader.ts +14 -30
- package/src/transports/smooth/isobmff/create_boxes.ts +4 -6
- package/src/transports/smooth/segment_loader.ts +4 -4
- package/src/transports/utils/call_custom_manifest_loader.ts +3 -3
- package/src/typings/globals.d.ts +21 -19
- package/src/utils/cancellable_sleep.ts +5 -14
- package/src/utils/create_cancellable_promise.ts +69 -0
- package/src/utils/is_null_or_undefined.ts +1 -1
- package/src/utils/reference.ts +6 -0
- package/src/utils/request/xhr.ts +1 -1
- package/src/utils/task_canceller.ts +63 -34
- package/tsconfig.json +1 -1
- package/tsconfig.modules.json +1 -1
- package/dist/_esm5.processed/core/init/utils/media_duration_updater.d.ts +0 -56
- package/locked_reps.js +0 -46
- package/scripts/doc-generator/construct_table_of_contents.js +0 -76
- package/scripts/doc-generator/convert_MD_to_HMTL.js +0 -26
- package/scripts/doc-generator/create_documentation.js +0 -331
- package/scripts/doc-generator/create_documentation_page.js +0 -209
- package/scripts/doc-generator/create_page.js +0 -210
- package/scripts/doc-generator/generate_header_html.js +0 -147
- package/scripts/doc-generator/generate_page_html.js +0 -115
- package/scripts/doc-generator/generate_page_list_html.js +0 -92
- package/scripts/doc-generator/generate_sidebar_html.js +0 -85
- package/scripts/doc-generator/get_search_data_for_content.js +0 -137
- package/scripts/doc-generator/index.js +0 -34
- package/scripts/doc-generator/parse_doc_configs.js +0 -327
- package/scripts/doc-generator/scripts/lunr.js +0 -10
- package/scripts/doc-generator/scripts/script.js +0 -451
- package/scripts/doc-generator/styles/code.css +0 -99
- package/scripts/doc-generator/styles/style.css +0 -835
- 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;
|