Skip to content

Commit 971d92c

Browse files
committed
feat(generic_pages): add support for generic pages
1 parent a1ccbb1 commit 971d92c

File tree

18 files changed

+359
-17
lines changed

18 files changed

+359
-17
lines changed

.github/workflows/release.yml

-2
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,8 @@ jobs:
2222
include:
2323
- target: x86_64-unknown-linux-musl
2424
os: ubuntu-latest
25-
build-tool: cargo-zigbuild
2625
- target: aarch64-unknown-linux-musl
2726
os: ubuntu-latest
28-
build-tool: cargo-zigbuild
2927
- target: aarch64-apple-darwin
3028
os: macos-latest
3129
- target: x86_64-pc-windows-msvc

crates/rari-doc/src/build.rs

+14-3
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ use rari_types::globals::build_out_root;
77
use rayon::iter::{IntoParallelIterator, ParallelIterator};
88
use tracing::{error, span, Level};
99

10-
use crate::cached_readers::{blog_files, curriculum_files};
10+
use crate::cached_readers::{blog_files, curriculum_files, generic_pages_files};
1111
use crate::error::DocError;
1212
use crate::pages::build::{
13-
build_blog_post, build_contributor_spotlight, build_curriculum, build_doc, build_spa,
14-
copy_additional_files,
13+
build_blog_post, build_contributor_spotlight, build_curriculum, build_doc, build_generic_page,
14+
build_spa, copy_additional_files,
1515
};
1616
use crate::pages::page::{Page, PageLike};
1717
use crate::pages::types::spa::SPA;
@@ -28,6 +28,7 @@ pub fn build_single_page(page: &Page) {
2828
Page::SPA(spa) => build_spa(spa),
2929
Page::Curriculum(curriculum) => build_curriculum(curriculum),
3030
Page::ContributorSpotlight(cs) => build_contributor_spotlight(cs),
31+
Page::GenericPage(generic) => build_generic_page(generic),
3132
};
3233
match built_page {
3334
Ok(built_page) => {
@@ -83,3 +84,13 @@ pub fn build_blog_pages() -> Result<Vec<Cow<'static, str>>, DocError> {
8384
})
8485
.collect())
8586
}
87+
88+
pub fn build_generic_pages() -> Result<Vec<Cow<'static, str>>, DocError> {
89+
Ok(generic_pages_files()
90+
.values()
91+
.map(|page| {
92+
build_single_page(page);
93+
Cow::Owned(page.url().to_string())
94+
})
95+
.collect())
96+
}

crates/rari-doc/src/cached_readers.rs

+43
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::sync::{Arc, LazyLock, OnceLock, RwLock};
55

66
use rari_types::globals::{
77
blog_root, cache_content, content_root, content_translated_root, curriculum_root,
8+
generic_pages_root,
89
};
910
use rari_types::locale::Locale;
1011
use rari_utils::io::read_to_string;
@@ -16,6 +17,7 @@ use crate::pages::page::{Page, PageLike};
1617
use crate::pages::types::blog::{Author, AuthorFrontmatter, BlogPost, BlogPostBuildMeta};
1718
use crate::pages::types::curriculum::{CurriculumIndexEntry, CurriculumPage};
1819
use crate::pages::types::doc::Doc;
20+
use crate::pages::types::generic::GenericPage;
1921
use crate::reader::read_docs_parallel;
2022
use crate::sidebars::jsref;
2123
use crate::translations::init_translations_from_static_docs;
@@ -29,6 +31,7 @@ type SidebarFilesCache = Arc<RwLock<HashMap<(String, Locale), Arc<MetaSidebar>>>
2931
pub static CACHED_SIDEBAR_FILES: LazyLock<SidebarFilesCache> =
3032
LazyLock::new(|| Arc::new(RwLock::new(HashMap::new())));
3133
pub static CACHED_CURRICULUM: OnceLock<CurriculumFiles> = OnceLock::new();
34+
pub static GENERIC_PAGES_FILES: OnceLock<GenericPagesFiles> = OnceLock::new();
3235

3336
#[derive(Debug, Default, Clone)]
3437
pub 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+
100127
pub 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+
}

crates/rari-doc/src/error.rs

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ pub enum DocError {
2323
NoSuchPrefix(#[from] StripPrefixError),
2424
#[error("No curricm root set")]
2525
NoCurriculumRoot,
26+
#[error("No generic pages roots set")]
27+
NoGenericPagesRoot,
2628
#[error("No H1 found")]
2729
NoH1,
2830
#[error(transparent)]

crates/rari-doc/src/pages/build.rs

+17-2
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,22 @@ use std::borrow::Cow;
22
use std::fs;
33
use std::path::Path;
44

5+
use concat_in_place::strcat;
56
use rari_types::fm_types::PageType;
67
use rari_types::globals::{base_url, content_branch, git_history, popularities};
78
use rari_types::locale::Locale;
89
use scraper::Html;
910

1011
use super::json::{
1112
BuiltDocy, Compat, ContributorSpotlightHyData, HyData, JsonBlogPost, JsonBlogPostDoc,
12-
JsonCurriculum, JsonDoADoc, JsonDoc, Prose, Section, Source, SpecificationSection, TocEntry,
13-
Translation,
13+
JsonCurriculum, JsonDoADoc, JsonDoc, JsonGenericHyData, JsonGenericPage, Prose, Section,
14+
Source, SpecificationSection, TocEntry, Translation,
1415
};
1516
use super::page::PageLike;
1617
use super::parents::parents;
1718
use super::title::{page_title, transform_title};
1819
use super::types::contributors::ContributorSpotlight;
20+
use super::types::generic::GenericPage;
1921
use crate::baseline::get_baseline;
2022
use crate::error::DocError;
2123
use crate::html::bubble_up::bubble_up_curriculum_page;
@@ -319,6 +321,19 @@ pub fn build_blog_post(post: &BlogPost) -> Result<BuiltDocy, DocError> {
319321
})))
320322
}
321323

324+
pub fn build_generic_page(page: &GenericPage) -> Result<BuiltDocy, DocError> {
325+
let PageContent { body, toc, .. } = build_content(page)?;
326+
Ok(BuiltDocy::GenericPage(Box::new(JsonGenericPage {
327+
hy_data: JsonGenericHyData {
328+
sections: body,
329+
title: page.meta.title.clone(),
330+
toc,
331+
},
332+
page_title: strcat!(page.meta.title.as_str() " | " page.meta.title_suffix.as_str()),
333+
url: page.meta.url.clone(),
334+
})))
335+
}
336+
322337
pub fn build_spa(spa: &SPA) -> Result<BuiltDocy, DocError> {
323338
spa.as_built_doc()
324339
}

crates/rari-doc/src/pages/json.rs

+17
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ pub enum BuiltDocy {
245245
BlogPost(Box<JsonBlogPost>),
246246
ContributorSpotlight(Box<JsonContributorSpotlight>),
247247
BasicSPA(Box<JsonBasicSPA>),
248+
GenericPage(Box<JsonGenericPage>),
248249
}
249250

250251
#[derive(Deserialize, Serialize, Clone, Debug, Default)]
@@ -289,3 +290,19 @@ pub struct JsonBasicSPA {
289290
pub no_indexing: bool,
290291
pub url: String,
291292
}
293+
294+
#[derive(Debug, Clone, Serialize)]
295+
#[serde(rename_all = "camelCase")]
296+
pub struct JsonGenericHyData {
297+
pub sections: Vec<Section>,
298+
pub title: String,
299+
pub toc: Vec<TocEntry>,
300+
}
301+
302+
#[derive(Debug, Clone, Serialize)]
303+
#[serde(rename_all = "camelCase")]
304+
pub struct JsonGenericPage {
305+
pub hy_data: JsonGenericHyData,
306+
pub page_title: String,
307+
pub url: String,
308+
}

crates/rari-doc/src/pages/page.rs

+7
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use rari_types::locale::Locale;
88
use rari_types::RariEnv;
99

1010
use super::types::contributors::contributor_spotlight_from_url;
11+
use super::types::generic::GenericPage;
1112
use crate::cached_readers::{blog_from_url, curriculum_from_url};
1213
use crate::error::DocError;
1314
use crate::pages::types::blog::BlogPost;
@@ -26,6 +27,7 @@ pub enum Page {
2627
SPA(Arc<SPA>),
2728
Curriculum(Arc<CurriculumPage>),
2829
ContributorSpotlight(Arc<ContributorSpotlight>),
30+
GenericPage(Arc<GenericPage>),
2931
}
3032

3133
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
@@ -35,6 +37,7 @@ pub enum PageCategory {
3537
SPA,
3638
Curriculum,
3739
ContributorSpotlight,
40+
GenericPage,
3841
}
3942

4043
impl Page {
@@ -95,6 +98,7 @@ impl PageReader for Page {
9598
PageCategory::SPA => SPA::read(path, locale),
9699
PageCategory::Curriculum => CurriculumPage::read(path, locale),
97100
PageCategory::ContributorSpotlight => ContributorSpotlight::read(path, locale),
101+
PageCategory::GenericPage => GenericPage::read(path, locale),
98102
}
99103
}
100104
}
@@ -142,6 +146,9 @@ pub fn url_path_to_page_with_other_locale_and_fallback(
142146
url_path.to_string(),
143147
PageCategory::ContributorSpotlight,
144148
)),
149+
PageCategory::GenericPage => GenericPage::from_slug(slug, locale).ok_or(
150+
DocError::PageNotFound(url_path.to_string(), PageCategory::GenericPage),
151+
),
145152
}
146153
}
147154

0 commit comments

Comments
 (0)