@@ -187,8 +187,8 @@ crate struct SharedContext {
187187 /// This flag indicates whether listings of modules (in the side bar and documentation itself)
188188 /// should be ordered alphabetically or in order of appearance (in the source code).
189189 pub sort_modules_alphabetically : bool ,
190- /// Additional themes to be added to the generated docs.
191- pub themes : Vec < PathBuf > ,
190+ /// Additional CSS files to be added to the generated docs.
191+ pub style_files : Vec < StylePath > ,
192192 /// Suffix to be added on resource files (if suffix is "-v2" then "light.css" becomes
193193 /// "light-v2.css").
194194 pub resource_suffix : String ,
@@ -417,6 +417,14 @@ impl Serialize for TypeWithKind {
417417 }
418418}
419419
420+ #[ derive( Debug , Clone ) ]
421+ pub struct StylePath {
422+ /// The path to the theme
423+ pub path : PathBuf ,
424+ /// What the `disabled` attribute should be set to in the HTML tag
425+ pub disabled : bool ,
426+ }
427+
420428thread_local ! ( static CACHE_KEY : RefCell <Arc <Cache >> = Default :: default ( ) ) ;
421429thread_local ! ( pub static CURRENT_DEPTH : Cell <usize > = Cell :: new( 0 ) ) ;
422430
@@ -460,7 +468,7 @@ pub fn run(
460468 id_map,
461469 playground_url,
462470 sort_modules_alphabetically,
463- themes,
471+ themes : style_files ,
464472 extension_css,
465473 extern_html_root_urls,
466474 resource_suffix,
@@ -530,7 +538,7 @@ pub fn run(
530538 layout,
531539 created_dirs : Default :: default ( ) ,
532540 sort_modules_alphabetically,
533- themes ,
541+ style_files ,
534542 resource_suffix,
535543 static_root_path,
536544 fs : DocFS :: new ( & errors) ,
@@ -539,6 +547,19 @@ pub fn run(
539547 playground,
540548 } ;
541549
550+ // Add the default themes to the `Vec` of stylepaths
551+ //
552+ // Note that these must be added before `sources::render` is called
553+ // so that the resulting source pages are styled
554+ //
555+ // `light.css` is not disabled because it is the stylesheet that stays loaded
556+ // by the browser as the theme stylesheet. The theme system (hackily) works by
557+ // changing the href to this stylesheet. All other themes are disabled to
558+ // prevent rule conflicts
559+ scx. style_files . push ( StylePath { path : PathBuf :: from ( "light.css" ) , disabled : false } ) ;
560+ scx. style_files . push ( StylePath { path : PathBuf :: from ( "dark.css" ) , disabled : true } ) ;
561+ scx. style_files . push ( StylePath { path : PathBuf :: from ( "ayu.css" ) , disabled : true } ) ;
562+
542563 let dst = output;
543564 scx. ensure_dir ( & dst) ?;
544565 krate = sources:: render ( & dst, & mut scx, krate) ?;
@@ -615,11 +636,40 @@ fn write_shared(
615636 // then we'll run over the "official" styles.
616637 let mut themes: FxHashSet < String > = FxHashSet :: default ( ) ;
617638
618- for entry in & cx. shared . themes {
619- let content = try_err ! ( fs:: read( & entry) , & entry) ;
620- let theme = try_none ! ( try_none!( entry. file_stem( ) , & entry) . to_str( ) , & entry) ;
621- let extension = try_none ! ( try_none!( entry. extension( ) , & entry) . to_str( ) , & entry) ;
622- cx. shared . fs . write ( cx. path ( & format ! ( "{}.{}" , theme, extension) ) , content. as_slice ( ) ) ?;
639+ for entry in & cx. shared . style_files {
640+ let theme = try_none ! ( try_none!( entry. path. file_stem( ) , & entry. path) . to_str( ) , & entry. path) ;
641+ let extension =
642+ try_none ! ( try_none!( entry. path. extension( ) , & entry. path) . to_str( ) , & entry. path) ;
643+
644+ // Handle the official themes
645+ match theme {
646+ "light" => write_minify (
647+ & cx. shared . fs ,
648+ cx. path ( "light.css" ) ,
649+ static_files:: themes:: LIGHT ,
650+ options. enable_minification ,
651+ ) ?,
652+ "dark" => write_minify (
653+ & cx. shared . fs ,
654+ cx. path ( "dark.css" ) ,
655+ static_files:: themes:: DARK ,
656+ options. enable_minification ,
657+ ) ?,
658+ "ayu" => write_minify (
659+ & cx. shared . fs ,
660+ cx. path ( "ayu.css" ) ,
661+ static_files:: themes:: AYU ,
662+ options. enable_minification ,
663+ ) ?,
664+ _ => {
665+ // Handle added third-party themes
666+ let content = try_err ! ( fs:: read( & entry. path) , & entry. path) ;
667+ cx. shared
668+ . fs
669+ . write ( cx. path ( & format ! ( "{}.{}" , theme, extension) ) , content. as_slice ( ) ) ?;
670+ }
671+ } ;
672+
623673 themes. insert ( theme. to_owned ( ) ) ;
624674 }
625675
@@ -633,20 +683,6 @@ fn write_shared(
633683 write ( cx. path ( "brush.svg" ) , static_files:: BRUSH_SVG ) ?;
634684 write ( cx. path ( "wheel.svg" ) , static_files:: WHEEL_SVG ) ?;
635685 write ( cx. path ( "down-arrow.svg" ) , static_files:: DOWN_ARROW_SVG ) ?;
636- write_minify (
637- & cx. shared . fs ,
638- cx. path ( "light.css" ) ,
639- static_files:: themes:: LIGHT ,
640- options. enable_minification ,
641- ) ?;
642- themes. insert ( "light" . to_owned ( ) ) ;
643- write_minify (
644- & cx. shared . fs ,
645- cx. path ( "dark.css" ) ,
646- static_files:: themes:: DARK ,
647- options. enable_minification ,
648- ) ?;
649- themes. insert ( "dark" . to_owned ( ) ) ;
650686
651687 let mut themes: Vec < & String > = themes. iter ( ) . collect ( ) ;
652688 themes. sort ( ) ;
@@ -957,7 +993,7 @@ themePicker.onblur = handleThemeButtonsBlur;
957993 } )
958994 . collect:: <String >( )
959995 ) ;
960- let v = layout:: render ( & cx. shared . layout , & page, "" , content, & cx. shared . themes ) ;
996+ let v = layout:: render ( & cx. shared . layout , & page, "" , content, & cx. shared . style_files ) ;
961997 cx. shared . fs . write ( & dst, v. as_bytes ( ) ) ?;
962998 }
963999 }
@@ -1375,7 +1411,7 @@ impl Context {
13751411 & page,
13761412 sidebar,
13771413 |buf : & mut Buffer | all. print ( buf) ,
1378- & self . shared . themes ,
1414+ & self . shared . style_files ,
13791415 ) ;
13801416 self . shared . fs . write ( & final_file, v. as_bytes ( ) ) ?;
13811417
@@ -1384,9 +1420,9 @@ impl Context {
13841420 page. description = "Settings of Rustdoc" ;
13851421 page. root_path = "./" ;
13861422
1387- let mut themes = self . shared . themes . clone ( ) ;
1423+ let mut style_files = self . shared . style_files . clone ( ) ;
13881424 let sidebar = "<p class='location'>Settings</p><div class='sidebar-elems'></div>" ;
1389- themes . push ( PathBuf :: from ( "settings.css" ) ) ;
1425+ style_files . push ( StylePath { path : PathBuf :: from ( "settings.css" ) , disabled : false } ) ;
13901426 let v = layout:: render (
13911427 & self . shared . layout ,
13921428 & page,
@@ -1395,7 +1431,7 @@ impl Context {
13951431 self . shared . static_root_path . as_deref ( ) . unwrap_or ( "./" ) ,
13961432 & self . shared . resource_suffix ,
13971433 ) ,
1398- & themes ,
1434+ & style_files ,
13991435 ) ;
14001436 self . shared . fs . write ( & settings_file, v. as_bytes ( ) ) ?;
14011437
@@ -1457,7 +1493,7 @@ impl Context {
14571493 & page,
14581494 |buf : & mut _ | print_sidebar ( self , it, buf) ,
14591495 |buf : & mut _ | print_item ( self , it, buf) ,
1460- & self . shared . themes ,
1496+ & self . shared . style_files ,
14611497 )
14621498 } else {
14631499 let mut url = self . root_path ( ) ;
0 commit comments