@@ -37,7 +37,40 @@ function maybeAddWarning() {
3737 closer . addEventListener ( "click" , function ( ) {
3838 document . body . removeChild ( div ) ;
3939 } ) ;
40- const href = window . documenterBaseURL + "/../" + window . DOCUMENTER_STABLE ;
40+ var target_href =
41+ window . documenterBaseURL + "/../" + window . DOCUMENTER_STABLE ;
42+
43+ // try to stay on the same page when linking to the stable version
44+ // get the current page path relative to the version root
45+ var current_page = window . location . pathname ;
46+
47+ // resolve the documenterBaseURL to an absolute path
48+ // documenterBaseURL is a relative path (usually "."), so we need to resolve it
49+ var base_url_absolute = new URL ( documenterBaseURL , window . location . href )
50+ . pathname ;
51+ if ( ! base_url_absolute . endsWith ( "/" ) ) {
52+ base_url_absolute = base_url_absolute + "/" ;
53+ }
54+
55+ // extract the page path after the version directory
56+ // e.g., if we're on /stable/man/guide.html, we want "man/guide.html"
57+ var page_path = "" ;
58+ if ( current_page . startsWith ( base_url_absolute ) ) {
59+ page_path = current_page . substring ( base_url_absolute . length ) ;
60+ }
61+
62+ // construct the target URL with the same page path
63+ var target_url = target_href ;
64+ if ( page_path && page_path !== "" && page_path !== "index.html" ) {
65+ // ensure target_href ends with a slash before appending page path
66+ if ( ! target_url . endsWith ( "/" ) ) {
67+ target_url = target_url + "/" ;
68+ }
69+ target_url = target_url + page_path ;
70+ }
71+
72+ // preserve the anchor (hash) from the current page
73+ var current_hash = window . location . hash ;
4174
4275 // Determine if this is a development version or an older release
4376 let warningMessage = "" ;
@@ -51,12 +84,35 @@ function maybeAddWarning() {
5184 "This documentation is for an <strong>older version</strong> that may be missing recent changes.<br>" ;
5285 }
5386
54- warningMessage +=
55- '<a href="' +
56- href +
57- '">Click here to go to the documentation for the latest stable release.</a>' ;
87+ // Create the link element with same-page navigation
88+ const link = document . createElement ( "a" ) ;
89+ link . href = target_url + current_hash ;
90+ link . textContent =
91+ "Click here to go to the documentation for the latest stable release." ;
92+
93+ // If we're trying to stay on the same page, verify it exists first
94+ if ( page_path && page_path !== "" && page_path !== "index.html" ) {
95+ link . addEventListener ( "click" , function ( e ) {
96+ e . preventDefault ( ) ;
97+ // check if the target page exists, fallback to homepage if it doesn't
98+ fetch ( target_url , { method : "HEAD" } )
99+ . then ( function ( response ) {
100+ if ( response . ok ) {
101+ window . location . href = target_url + current_hash ;
102+ } else {
103+ // page doesn't exist in the target version, go to homepage
104+ window . location . href = target_href ;
105+ }
106+ } )
107+ . catch ( function ( error ) {
108+ // network error or other failure - use homepage
109+ window . location . href = target_href ;
110+ } ) ;
111+ } ) ;
112+ }
58113
59114 div . innerHTML = warningMessage ;
115+ div . appendChild ( link ) ;
60116 div . appendChild ( closer ) ;
61117 document . body . appendChild ( div ) ;
62118}
0 commit comments