Skip to content

Commit 71adb36

Browse files
committed
feat(sitemap): build sitemap.txt
1 parent 1468878 commit 71adb36

File tree

2 files changed

+51
-22
lines changed

2 files changed

+51
-22
lines changed

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

+24-13
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::borrow::Cow;
12
use std::fs::{self, File};
23
use std::io::BufWriter;
34
use std::iter::once;
@@ -42,25 +43,35 @@ pub fn build_single_page(page: &Page) {
4243
}
4344
}
4445

45-
pub fn build_docs(docs: Vec<Page>) -> Result<(), DocError> {
46-
docs.into_par_iter()
47-
.for_each(|page| build_single_page(&page));
48-
Ok(())
46+
pub fn build_docs(docs: &[Page]) -> Result<Vec<Cow<'_, str>>, DocError> {
47+
Ok(docs
48+
.into_par_iter()
49+
.map(|page| {
50+
build_single_page(page);
51+
Cow::Borrowed(page.url())
52+
})
53+
.collect())
4954
}
5055

51-
pub fn build_curriculum_pages() -> Result<(), DocError> {
52-
curriculum_files()
56+
pub fn build_curriculum_pages() -> Result<Vec<Cow<'static, str>>, DocError> {
57+
Ok(curriculum_files()
5358
.by_path
54-
.iter()
55-
.for_each(|(_, page)| build_single_page(page));
56-
Ok(())
59+
.values()
60+
.map(|page| {
61+
build_single_page(page);
62+
Cow::Owned(page.url().to_string())
63+
})
64+
.collect())
5765
}
5866

59-
pub fn build_blog_pages() -> Result<(), DocError> {
60-
blog_files()
67+
pub fn build_blog_pages() -> Result<Vec<Cow<'static, str>>, DocError> {
68+
Ok(blog_files()
6169
.posts
6270
.values()
6371
.chain(once(&Dummy::from_url("/en-US/blog/").unwrap()))
64-
.for_each(build_single_page);
65-
Ok(())
72+
.map(|page| {
73+
build_single_page(page);
74+
Cow::Owned(page.url().to_string())
75+
})
76+
.collect())
6677
}

Diff for: src/main.rs

+27-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::collections::HashMap;
2-
use std::io::Write;
2+
use std::fs::{self, File};
3+
use std::io::{BufWriter, Write};
34
use std::path::PathBuf;
45
use std::sync::mpsc::channel;
56
use std::sync::{Arc, RwLock};
@@ -14,7 +15,7 @@ use rari_doc::utils::TEMPL_RECORDER_SENDER;
1415
use rari_doc::walker::read_docs_parallel;
1516
use rari_tools::history::gather_history;
1617
use rari_tools::popularities::update_popularities;
17-
use rari_types::globals::SETTINGS;
18+
use rari_types::globals::{build_out_root, SETTINGS};
1819
use rari_types::settings::Settings;
1920
use tabwriter::TabWriter;
2021
use tracing_log::AsTrace;
@@ -69,6 +70,8 @@ struct BuildArgs {
6970
#[arg(long)]
7071
skip_curriculum: bool,
7172
#[arg(long)]
73+
skip_sitemap: bool,
74+
#[arg(long)]
7275
templ_stats: bool,
7376
}
7477

@@ -163,21 +166,36 @@ fn main() -> Result<(), anyhow::Error> {
163166
)
164167
.unwrap();
165168
}
166-
println!("Took: {:?} for {}", start.elapsed(), docs.len());
169+
println!("Took: {: >10.3?} for {}", start.elapsed(), docs.len());
170+
let mut urls = Vec::new();
167171
if !args.skip_content {
168172
let start = std::time::Instant::now();
169-
build_docs(docs)?;
170-
println!("Took: {:?} to build content", start.elapsed());
173+
urls.extend(build_docs(&docs)?);
174+
println!("Took: {: >10.3?} to build content", start.elapsed());
171175
}
172176
if !args.skip_curriculum && args.files.is_empty() {
173177
let start = std::time::Instant::now();
174-
build_curriculum_pages()?;
175-
println!("Took: {:?} to build curriculum", start.elapsed());
178+
urls.extend(build_curriculum_pages()?);
179+
println!("Took: {: >10.3?} to build curriculum", start.elapsed());
176180
}
177181
if !args.skip_blog && args.files.is_empty() {
178182
let start = std::time::Instant::now();
179-
build_blog_pages()?;
180-
println!("Took: {:?} to build blog", start.elapsed());
183+
urls.extend(build_blog_pages()?);
184+
println!("Took: {: >10.3?} to build blog", start.elapsed());
185+
}
186+
if !args.skip_sitemap && args.files.is_empty() && !urls.is_empty() {
187+
let start = std::time::Instant::now();
188+
let out_path = build_out_root()?;
189+
fs::create_dir_all(out_path).unwrap();
190+
let out_file = out_path.join("sitemap.txt");
191+
let file = File::create(out_file).unwrap();
192+
let mut buffed = BufWriter::new(file);
193+
urls.sort();
194+
for url in urls {
195+
buffed.write_all(url.as_bytes())?;
196+
buffed.write_all(b"\n")?;
197+
}
198+
println!("Took: {: >10.3?} to write sitemap.txt", start.elapsed());
181199
}
182200
if let Some((recorder_handler, tx)) = templ_stats {
183201
tx.send("∞".to_string())?;

0 commit comments

Comments
 (0)