11'use strict' ;
22
3+ const _CURRENT_VERSION = DOCUMENTATION_OPTIONS . VERSION ;
4+ const _CURRENT_LANGUAGE = DOCUMENTATION_OPTIONS . LANGUAGE ?. toLowerCase ( ) || 'en' ;
5+ const _CURRENT_PREFIX = ( ( ) => {
6+ // Sphinx 7.2+ defines the content root data attribute in the HTML element.
7+ const _CONTENT_ROOT = document . documentElement . dataset . content_root ;
8+ if ( _CONTENT_ROOT !== undefined ) {
9+ return new URL ( _CONTENT_ROOT , window . location ) . pathname ;
10+ }
11+ // Fallback for older versions of Sphinx (used in Python 3.10 and older).
12+ const _NUM_PREFIX_PARTS = _CURRENT_LANGUAGE === 'en' ? 2 : 3 ;
13+ return window . location . pathname . split ( '/' , _NUM_PREFIX_PARTS ) . join ( '/' ) + '/' ;
14+ } ) ( ) ;
15+
316// Parses versions in URL segments like:
417const _VERSION_PATTERN = (
518 '((?:'
@@ -77,20 +90,15 @@ const _navigate_to_first_existing = (urls) => {
7790const _on_version_switch = ( ) => {
7891 const selected_version = this . options [ this . selectedIndex ] . value + '/' ;
7992 const url = window . location . href ;
80- const current_language = language_segment_from_url ( ) ;
81- const current_version = version_segment_from_url ( ) ;
8293 const new_url = url . replace (
83- '/' + current_language + current_version ,
84- '/' + current_language + selected_version ,
94+ _CURRENT_PREFIX ,
95+ '/' + _CURRENT_LANGUAGE + selected_version ,
8596 ) ;
8697 if ( new_url !== url ) {
8798 _navigate_to_first_existing ( [
8899 new_url ,
89- url . replace (
90- '/' + current_language + current_version ,
91- '/' + selected_version ,
92- ) ,
93- '/' + current_language + selected_version ,
100+ url . replace ( _CURRENT_PREFIX , '/' + selected_version ) ,
101+ '/' + _CURRENT_LANGUAGE + selected_version ,
94102 '/' + selected_version ,
95103 '/' ,
96104 ] ) ;
@@ -100,14 +108,12 @@ const _on_version_switch = () => {
100108const _on_language_switch = ( ) => {
101109 let selected_language = this . options [ this . selectedIndex ] . value + '/' ;
102110 const url = window . location . href ;
103- const current_language = language_segment_from_url ( ) ;
104- const current_version = version_segment_from_url ( ) ;
105111 if ( selected_language === 'en/' )
106112 // Special 'default' case for English.
107113 selected_language = '' ;
108114 let new_url = url . replace (
109- '/' + current_language + current_version ,
110- '/' + selected_language + current_version ,
115+ _CURRENT_PREFIX ,
116+ '/' + selected_language + _CURRENT_VERSION ,
111117 ) ;
112118 if ( new_url !== url ) {
113119 _navigate_to_first_existing ( [ new_url , '/' ] ) ;
@@ -135,10 +141,7 @@ function version_segment_from_url() {
135141 return '' ;
136142}
137143const _initialise_switchers = ( ) => {
138- const language_segment = language_segment_from_url ( ) ;
139- const current_language = language_segment . replace ( / \/ + $ / g, '' ) || 'en' ;
140-
141- const version_select = _create_version_select ( DOCUMENTATION_OPTIONS . VERSION ) ;
144+ const version_select = _create_version_select ( _CURRENT_VERSION ) ;
142145 document
143146 . querySelectorAll ( '.version_switcher_placeholder' )
144147 . forEach ( ( placeholder ) => {
@@ -147,7 +150,7 @@ const _initialise_switchers = () => {
147150 placeholder . append ( s ) ;
148151 } ) ;
149152
150- const language_select = _create_language_select ( current_language ) ;
153+ const language_select = _create_language_select ( _CURRENT_LANGUAGE ) ;
151154 document
152155 . querySelectorAll ( '.language_switcher_placeholder' )
153156 . forEach ( ( placeholder ) => {
0 commit comments