@@ -5,6 +5,7 @@ use std::sync::{Arc, LazyLock, OnceLock, RwLock};
55
66use rari_types:: globals:: {
77 blog_root, cache_content, content_root, content_translated_root, curriculum_root,
8+ generic_pages_root,
89} ;
910use rari_types:: locale:: Locale ;
1011use rari_utils:: io:: read_to_string;
@@ -16,6 +17,7 @@ use crate::pages::page::{Page, PageLike};
1617use crate :: pages:: types:: blog:: { Author , AuthorFrontmatter , BlogPost , BlogPostBuildMeta } ;
1718use crate :: pages:: types:: curriculum:: { CurriculumIndexEntry , CurriculumPage } ;
1819use crate :: pages:: types:: doc:: Doc ;
20+ use crate :: pages:: types:: generic:: GenericPage ;
1921use crate :: reader:: read_docs_parallel;
2022use crate :: sidebars:: jsref;
2123use crate :: translations:: init_translations_from_static_docs;
@@ -29,6 +31,7 @@ type SidebarFilesCache = Arc<RwLock<HashMap<(String, Locale), Arc<MetaSidebar>>>
2931pub static CACHED_SIDEBAR_FILES : LazyLock < SidebarFilesCache > =
3032 LazyLock :: new ( || Arc :: new ( RwLock :: new ( HashMap :: new ( ) ) ) ) ;
3133pub static CACHED_CURRICULUM : OnceLock < CurriculumFiles > = OnceLock :: new ( ) ;
34+ pub static GENERIC_PAGES_FILES : OnceLock < GenericPagesFiles > = OnceLock :: new ( ) ;
3235
3336#[ derive( Debug , Default , Clone ) ]
3437pub struct BlogFiles {
@@ -97,6 +100,30 @@ pub fn gather_blog_posts() -> Result<HashMap<String, Page>, DocError> {
97100 }
98101}
99102
103+ pub fn gather_generic_pages ( ) -> Result < HashMap < String , Page > , DocError > {
104+ if let Some ( root) = generic_pages_root ( ) {
105+ Ok ( read_docs_parallel :: < GenericPage > ( & [ root] , Some ( "*.md" ) ) ?
106+ . into_iter ( )
107+ . filter_map ( |page| {
108+ if let Page :: GenericPage ( generic) = page {
109+ Some ( generic)
110+ } else {
111+ None
112+ }
113+ } )
114+ . flat_map ( |generic| {
115+ Locale :: all ( )
116+ . iter ( )
117+ . map ( |locale| Page :: GenericPage ( Arc :: new ( generic. as_locale ( * locale) ) ) )
118+ . collect :: < Vec < _ > > ( )
119+ } )
120+ . map ( |page| ( page. url ( ) . to_ascii_lowercase ( ) , page) )
121+ . collect ( ) )
122+ } else {
123+ Err ( DocError :: NoGenericPagesRoot )
124+ }
125+ }
126+
100127pub fn gather_curriculum ( ) -> Result < CurriculumFiles , DocError > {
101128 if let Some ( curriculum_root) = curriculum_root ( ) {
102129 let curriculum_root = curriculum_root. join ( "curriculum" ) ;
@@ -275,3 +302,19 @@ pub fn read_and_cache_doc_pages() -> Result<Vec<Page>, DocError> {
275302 init_translations_from_static_docs ( ) ;
276303 Ok ( docs)
277304}
305+
306+ pub type GenericPagesFiles = HashMap < String , Page > ;
307+
308+ pub fn generic_pages_files ( ) -> Cow < ' static , GenericPagesFiles > {
309+ fn gather ( ) -> GenericPagesFiles {
310+ gather_generic_pages ( ) . unwrap_or_else ( |e| {
311+ error ! ( "{e}" ) ;
312+ Default :: default ( )
313+ } )
314+ }
315+ if cache_content ( ) {
316+ Cow :: Borrowed ( GENERIC_PAGES_FILES . get_or_init ( gather) )
317+ } else {
318+ Cow :: Owned ( gather ( ) )
319+ }
320+ }
0 commit comments