@@ -5,6 +5,7 @@ use std::sync::{Arc, LazyLock, OnceLock, RwLock};
5
5
6
6
use rari_types:: globals:: {
7
7
blog_root, cache_content, content_root, content_translated_root, curriculum_root,
8
+ generic_pages_root,
8
9
} ;
9
10
use rari_types:: locale:: Locale ;
10
11
use rari_utils:: io:: read_to_string;
@@ -16,6 +17,7 @@ use crate::pages::page::{Page, PageLike};
16
17
use crate :: pages:: types:: blog:: { Author , AuthorFrontmatter , BlogPost , BlogPostBuildMeta } ;
17
18
use crate :: pages:: types:: curriculum:: { CurriculumIndexEntry , CurriculumPage } ;
18
19
use crate :: pages:: types:: doc:: Doc ;
20
+ use crate :: pages:: types:: generic:: GenericPage ;
19
21
use crate :: reader:: read_docs_parallel;
20
22
use crate :: sidebars:: jsref;
21
23
use crate :: translations:: init_translations_from_static_docs;
@@ -29,6 +31,7 @@ type SidebarFilesCache = Arc<RwLock<HashMap<(String, Locale), Arc<MetaSidebar>>>
29
31
pub static CACHED_SIDEBAR_FILES : LazyLock < SidebarFilesCache > =
30
32
LazyLock :: new ( || Arc :: new ( RwLock :: new ( HashMap :: new ( ) ) ) ) ;
31
33
pub static CACHED_CURRICULUM : OnceLock < CurriculumFiles > = OnceLock :: new ( ) ;
34
+ pub static GENERIC_PAGES_FILES : OnceLock < GenericPagesFiles > = OnceLock :: new ( ) ;
32
35
33
36
#[ derive( Debug , Default , Clone ) ]
34
37
pub struct BlogFiles {
@@ -97,6 +100,30 @@ pub fn gather_blog_posts() -> Result<HashMap<String, Page>, DocError> {
97
100
}
98
101
}
99
102
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
+
100
127
pub fn gather_curriculum ( ) -> Result < CurriculumFiles , DocError > {
101
128
if let Some ( curriculum_root) = curriculum_root ( ) {
102
129
let curriculum_root = curriculum_root. join ( "curriculum" ) ;
@@ -275,3 +302,19 @@ pub fn read_and_cache_doc_pages() -> Result<Vec<Page>, DocError> {
275
302
init_translations_from_static_docs ( ) ;
276
303
Ok ( docs)
277
304
}
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