Skip to content

Commit 526d841

Browse files
committed
feat(spas): initial support for spas
starting with contributor spotlight.
1 parent 2b84868 commit 526d841

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+478
-129
lines changed

Diff for: crates/rari-doc/src/build.rs

+11-3
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,13 @@ use rayon::iter::{IntoParallelIterator, ParallelIterator};
88
use tracing::{error, span, Level};
99

1010
use crate::cached_readers::{blog_files, curriculum_files};
11-
use crate::docs::build::{build_blog_post, build_curriculum, build_doc, build_dummy};
12-
use crate::docs::dummy::Dummy;
13-
use crate::docs::page::{Page, PageLike};
1411
use crate::error::DocError;
12+
use crate::pages::build::{
13+
build_blog_post, build_contributor_spotlight, build_curriculum, build_doc, build_dummy,
14+
copy_additional_files,
15+
};
16+
use crate::pages::page::{Page, PageLike};
17+
use crate::pages::types::dummy::Dummy;
1518
use crate::resolve::url_to_path_buf;
1619

1720
pub fn build_single_page(page: &Page) {
@@ -24,6 +27,7 @@ pub fn build_single_page(page: &Page) {
2427
Page::BlogPost(post) => build_blog_post(post),
2528
Page::Dummy(dummy) => build_dummy(dummy),
2629
Page::Curriculum(curriculum) => build_curriculum(curriculum),
30+
Page::ContributorSpotlight(cs) => build_contributor_spotlight(cs),
2731
};
2832
match built_page {
2933
Ok(built_page) => {
@@ -36,6 +40,10 @@ pub fn build_single_page(page: &Page) {
3640
let buffed = BufWriter::new(file);
3741

3842
serde_json::to_writer(buffed, &built_page).unwrap();
43+
44+
if let Some(in_path) = page.full_path().parent() {
45+
copy_additional_files(in_path, &out_path).unwrap();
46+
}
3947
}
4048
Err(e) => {
4149
error!("Error: {e}");

Diff for: crates/rari-doc/src/cached_readers.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ use rari_types::locale::Locale;
1010
use rari_utils::io::read_to_string;
1111
use tracing::error;
1212

13-
use crate::docs::blog::{Author, AuthorFrontmatter, BlogPost, BlogPostBuildMeta};
14-
use crate::docs::curriculum::{CurriculumIndexEntry, CurriculumPage};
15-
use crate::docs::doc::Doc;
16-
use crate::docs::page::{Page, PageLike};
1713
use crate::error::DocError;
1814
use crate::html::sidebar::{MetaSidebar, Sidebar};
15+
use crate::pages::page::{Page, PageLike};
16+
use crate::pages::types::blog::{Author, AuthorFrontmatter, BlogPost, BlogPostBuildMeta};
17+
use crate::pages::types::curriculum::{CurriculumIndexEntry, CurriculumPage};
18+
use crate::pages::types::doc::Doc;
1919
use crate::reader::read_docs_parallel;
2020
use crate::sidebars::jsref;
2121
use crate::translations::init_translations_from_static_docs;

Diff for: crates/rari-doc/src/docs/types.rs

-32
This file was deleted.

Diff for: crates/rari-doc/src/error.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use rari_types::locale::LocaleError;
99
use rari_types::ArgError;
1010
use thiserror::Error;
1111

12-
use crate::docs::page::PageCategory;
12+
use crate::pages::page::PageCategory;
1313

1414
#[derive(Debug, Error)]
1515
pub enum DocError {

Diff for: crates/rari-doc/src/helpers/subpages.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ use rari_types::globals::deny_warnings;
99
use rari_types::locale::Locale;
1010

1111
use super::titles::api_page_title;
12-
use crate::docs::page::{
12+
use crate::error::DocError;
13+
use crate::pages::page::{
1314
url_path_to_page_with_other_locale_and_fallback, Page, PageLike, PageReader,
1415
};
15-
use crate::error::DocError;
1616
use crate::redirects::resolve_redirect;
1717
use crate::templ::templs::badges::{write_deprecated, write_experimental, write_non_standard};
1818
use crate::utils::COLLATOR;
@@ -214,7 +214,7 @@ pub fn get_sub_pages(
214214
let mut sub_pages = sub_folders
215215
.iter()
216216
.filter(|f| f.as_path() != full_path)
217-
.map(Page::read)
217+
.map(|p| Page::read(p, Some(doc.locale())))
218218
.collect::<Result<Vec<_>, DocError>>()?;
219219
sub_pages.sort_by(sorter.sorter());
220220
return Ok(sub_pages);

Diff for: crates/rari-doc/src/helpers/summary_hack.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
use crate::docs::doc::render_md_to_html;
2-
use crate::docs::page::{Page, PageLike};
31
use crate::error::DocError;
2+
use crate::pages::page::{Page, PageLike};
3+
use crate::pages::types::doc::render_md_to_html;
44
use crate::templ::render::render_for_summary;
55

66
/// There's a few places were we still tansplant content.

Diff for: crates/rari-doc/src/helpers/titles.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use rari_types::fm_types::PageType;
22

3-
use crate::docs::page::{Page, PageLike};
3+
use crate::pages::page::{Page, PageLike};
44

55
pub fn api_page_title(page: &Page) -> &str {
66
if let Some(short_title) = page.short_title() {

Diff for: crates/rari-doc/src/helpers/webextapi.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ use rari_l10n::l10n_json_data;
22
use rari_types::fm_types::PageType;
33
use rari_types::locale::Locale;
44

5-
use crate::docs::page::{Page, PageLike};
65
use crate::error::DocError;
76
use crate::helpers::subpages::{get_sub_pages, SubPagesSorter};
87
use crate::helpers::titles::api_page_title;
98
use crate::html::sidebar::{Details, MetaChildren, SidebarMetaEntry, SidebarMetaEntryContent};
9+
use crate::pages::page::{Page, PageLike};
1010

1111
pub fn entry(slug: &str, locale: Locale) -> Result<Vec<SidebarMetaEntry>, DocError> {
1212
let properties_label = l10n_json_data("Common", "Properties", locale)?;

Diff for: crates/rari-doc/src/html/links.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ use rari_types::fm_types::FeatureStatus;
55
use rari_types::locale::Locale;
66
use tracing::warn;
77

8-
use crate::docs::page::{Page, PageLike};
98
use crate::error::DocError;
9+
use crate::pages::page::{Page, PageLike};
1010
use crate::templ::api::RariApi;
1111
use crate::templ::templs::badges::{write_deprecated, write_experimental, write_non_standard};
1212

Diff for: crates/rari-doc/src/html/rewriter.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ use rari_types::fm_types::PageType;
99
use rari_types::locale::Locale;
1010
use url::Url;
1111

12-
use crate::docs::curriculum::relative_file_to_curriculum_page;
13-
use crate::docs::page::{Page, PageLike};
1412
use crate::error::DocError;
13+
use crate::pages::page::{Page, PageLike};
14+
use crate::pages::types::curriculum::relative_file_to_curriculum_page;
1515
use crate::redirects::resolve_redirect;
1616
use crate::resolve::strip_locale_from_url;
1717

Diff for: crates/rari-doc/src/html/sidebar.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ use super::links::{render_link_from_page, render_link_via_page, LinkModifier};
1212
use super::modifier::add_attribute;
1313
use super::rewriter::post_process_html;
1414
use crate::cached_readers::read_sidebar;
15-
use crate::docs::doc::Doc;
16-
use crate::docs::page::{Page, PageLike};
1715
use crate::error::DocError;
1816
use crate::helpers;
1917
use crate::helpers::subpages::{list_sub_pages_grouped_internal, list_sub_pages_internal};
18+
use crate::pages::page::{Page, PageLike};
19+
use crate::pages::types::doc::Doc;
2020
use crate::utils::t_or_vec;
2121

2222
fn cache_side_bar(sidebar: &str) -> bool {

Diff for: crates/rari-doc/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
pub mod baseline;
22
pub mod build;
33
pub mod cached_readers;
4-
pub mod docs;
54
pub mod error;
65
pub mod helpers;
76
pub mod html;
7+
pub mod pages;
88
pub mod percent;
99
pub mod reader;
1010
pub mod redirects;

Diff for: crates/rari-doc/src/docs/build.rs renamed to crates/rari-doc/src/pages/build.rs

+49-9
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,21 @@
11
use std::borrow::Cow;
2+
use std::fs;
3+
use std::path::Path;
24

35
use rari_types::fm_types::PageType;
46
use rari_types::globals::{base_url, content_branch, git_history, popularities};
57
use rari_types::locale::Locale;
68
use scraper::Html;
79

8-
use super::blog::BlogPost;
9-
use super::curriculum::{
10-
build_landing_modules, build_overview_modules, build_sidebar, curriculum_group,
11-
prev_next_modules, prev_next_overview, CurriculumPage, Template,
12-
};
13-
use super::doc::{render_md_to_html, Doc};
14-
use super::dummy::Dummy;
1510
use super::json::{
16-
BuiltDocy, Compat, JsonBlogPost, JsonBlogPostDoc, JsonCurriculum, JsonDoADoc, JsonDoc, Prose,
17-
Section, Source, SpecificationSection, TocEntry, Translation,
11+
BuiltDocy, Compat, ContributorSpotlightHyData, HyData, JsonBlogPost, JsonBlogPostDoc,
12+
JsonCurriculum, JsonDoADoc, JsonDoc, Prose, Section, Source, SpecificationSection, TocEntry,
13+
Translation,
1814
};
1915
use super::page::PageLike;
2016
use super::parents::parents;
2117
use super::title::{page_title, transform_title};
18+
use super::types::contributors::ContributorSpotlight;
2219
use crate::baseline::get_baseline;
2320
use crate::error::DocError;
2421
use crate::html::bubble_up::bubble_up_curriculum_page;
@@ -28,6 +25,14 @@ use crate::html::sections::{split_sections, BuildSection, BuildSectionType, Spli
2825
use crate::html::sidebar::{
2926
build_sidebars, expand_details_and_mark_current_for_inline_sidebar, postprocess_sidebar,
3027
};
28+
use crate::pages::json::JsonContributorSpotlight;
29+
use crate::pages::types::blog::BlogPost;
30+
use crate::pages::types::curriculum::{
31+
build_landing_modules, build_overview_modules, build_sidebar, curriculum_group,
32+
prev_next_modules, prev_next_overview, CurriculumPage, Template,
33+
};
34+
use crate::pages::types::doc::{render_md_to_html, Doc};
35+
use crate::pages::types::dummy::Dummy;
3136
use crate::specs::extract_specifications;
3237
use crate::templ::render::{decode_ref, render, Rendered};
3338
use crate::translations::get_translations_for;
@@ -357,3 +362,38 @@ pub fn build_curriculum(curriculum: &CurriculumPage) -> Result<BuiltDocy, DocErr
357362
locale: curriculum.locale(),
358363
})))
359364
}
365+
366+
pub fn build_contributor_spotlight(cs: &ContributorSpotlight) -> Result<BuiltDocy, DocError> {
367+
let PageContent { body, .. } = build_content(cs)?;
368+
let hy_data = ContributorSpotlightHyData {
369+
sections: body,
370+
contributor_name: cs.meta.contributor_name.clone(),
371+
folder_name: cs.meta.folder_name.clone(),
372+
is_featured: cs.meta.is_featured,
373+
profile_img: cs.meta.img.clone(),
374+
profile_img_alt: cs.meta.img_alt.clone(),
375+
usernames: cs.meta.usernames.clone(),
376+
quote: cs.meta.quote.clone(),
377+
};
378+
Ok(BuiltDocy::ContributorSpotlight(Box::new(
379+
JsonContributorSpotlight {
380+
url: cs.meta.url.clone(),
381+
page_title: cs.meta.title.clone(),
382+
hy_data: HyData::ContributorSpotlight(hy_data),
383+
},
384+
)))
385+
}
386+
387+
pub fn copy_additional_files(from: &Path, to: &Path) -> Result<(), DocError> {
388+
for from in fs::read_dir(from)?
389+
.filter_map(Result::ok)
390+
.map(|f| f.path())
391+
.filter(|p| p.is_file())
392+
{
393+
if let Some(filename) = from.file_name() {
394+
let to = to.to_path_buf().join(filename);
395+
fs::copy(&from, to)?;
396+
}
397+
}
398+
Ok(())
399+
}

Diff for: crates/rari-doc/src/docs/json.rs renamed to crates/rari-doc/src/pages/json.rs

+65-5
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ use std::path::PathBuf;
33
use chrono::NaiveDateTime;
44
use rari_data::baseline::SupportStatusWithByKey;
55
use rari_types::locale::{Locale, Native};
6-
use serde::Serialize;
6+
use serde::{Deserialize, Serialize};
77

8-
use super::blog::BlogMeta;
9-
use super::curriculum::{CurriculumIndexEntry, CurriculumSidebarEntry, Template, Topic};
10-
use super::dummy::BlogIndex;
11-
use super::types::PrevNextCurriculum;
8+
use super::types::contributors::Usernames;
9+
use super::types::curriculum::{CurriculumIndexEntry, CurriculumSidebarEntry, Template, Topic};
10+
use crate::pages::types::blog::BlogMeta;
11+
use crate::pages::types::dummy::BlogIndex;
1212
use crate::specs::Specification;
1313
use crate::utils::modified_dt;
1414

@@ -121,6 +121,7 @@ pub struct JsonDoc {
121121
#[serde(untagged)]
122122
pub enum HyData {
123123
BlogIndex(BlogIndex),
124+
ContributorSpotlight(ContributorSpotlightHyData),
124125
}
125126

126127
#[derive(Debug, Clone, Serialize, Default)]
@@ -167,6 +168,7 @@ pub struct JsonCurriculumDoc {
167168
pub prev_next: Option<PrevNextCurriculum>,
168169
pub template: Template,
169170
}
171+
170172
#[derive(Debug, Clone, Serialize, Default)]
171173
pub struct JsonCurriculum {
172174
pub doc: JsonCurriculumDoc,
@@ -210,10 +212,68 @@ pub struct JsonBlogPost {
210212
pub hy_data: Option<HyData>,
211213
}
212214

215+
#[derive(Debug, Clone, Serialize)]
216+
pub struct ContributorSpotlightHyData {
217+
pub sections: Vec<Section>,
218+
#[serde(rename = "contributorName")]
219+
pub contributor_name: String,
220+
#[serde(rename = "folderName")]
221+
pub folder_name: String,
222+
#[serde(rename = "isFeatured")]
223+
pub is_featured: bool,
224+
#[serde(rename = "profileImg")]
225+
pub profile_img: String,
226+
#[serde(rename = "profileImgAlt")]
227+
pub profile_img_alt: String,
228+
pub usernames: Usernames,
229+
pub quote: String,
230+
}
231+
232+
#[derive(Debug, Clone, Serialize)]
233+
pub struct JsonContributorSpotlight {
234+
pub url: String,
235+
#[serde(rename = "pageTitle")]
236+
pub page_title: String,
237+
#[serde(rename = "hyData")]
238+
pub hy_data: HyData,
239+
}
213240
#[derive(Debug, Clone, Serialize)]
214241
#[serde(untagged)]
215242
pub enum BuiltDocy {
216243
Doc(Box<JsonDoADoc>),
217244
Curriculum(Box<JsonCurriculum>),
218245
BlogPost(Box<JsonBlogPost>),
246+
ContributorSpotlight(Box<JsonContributorSpotlight>),
247+
}
248+
249+
#[derive(Deserialize, Serialize, Clone, Debug, Default)]
250+
#[serde(default)]
251+
pub struct PrevNextBlog {
252+
pub previous: Option<SlugNTitle>,
253+
pub next: Option<SlugNTitle>,
254+
}
255+
256+
impl PrevNextBlog {
257+
pub fn is_none(&self) -> bool {
258+
self.previous.is_none() && self.next.is_none()
259+
}
260+
}
261+
262+
#[derive(Deserialize, Serialize, Clone, Debug, Default)]
263+
pub struct SlugNTitle {
264+
pub title: String,
265+
pub slug: String,
266+
}
267+
268+
#[derive(Deserialize, Serialize, Clone, Debug, Default)]
269+
#[serde(default)]
270+
pub struct PrevNextCurriculum {
271+
pub prev: Option<UrlNTitle>,
272+
pub next: Option<UrlNTitle>,
273+
}
274+
275+
#[derive(Deserialize, Serialize, Clone, Debug, Default)]
276+
pub struct UrlNTitle {
277+
pub title: String,
278+
pub url: String,
219279
}

Diff for: crates/rari-doc/src/docs/mod.rs renamed to crates/rari-doc/src/pages/mod.rs

-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
pub mod blog;
21
pub mod build;
3-
pub mod curriculum;
4-
pub mod doc;
5-
pub mod dummy;
62
pub mod json;
73
pub mod page;
84
pub mod parents;

0 commit comments

Comments
 (0)