Skip to content

Commit 8323644

Browse files
committed
feat(seach-index): build search index
1 parent 56127ad commit 8323644

File tree

3 files changed

+72
-0
lines changed

3 files changed

+72
-0
lines changed

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

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ pub mod percent;
99
pub mod reader;
1010
pub mod redirects;
1111
pub mod resolve;
12+
pub mod search_index;
1213
pub mod sidebars;
1314
pub mod specs;
1415
pub mod templ;

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

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
use std::cmp::Ordering;
2+
use std::collections::HashMap;
3+
use std::fs::File;
4+
use std::io::BufWriter;
5+
6+
use rari_types::globals::{build_out_root, content_root};
7+
use rari_types::locale::Locale;
8+
use rari_types::Popularities;
9+
use rari_utils::io::read_to_string;
10+
use serde::Serialize;
11+
12+
use crate::error::DocError;
13+
use crate::pages::page::{Page, PageLike};
14+
15+
#[derive(Debug, Serialize)]
16+
pub struct SearchItem<'a> {
17+
title: &'a str,
18+
url: &'a str,
19+
}
20+
21+
pub fn build_search_index(docs: &[Page]) -> Result<(), DocError> {
22+
let in_file = content_root().join("en-US").join("popularities.json");
23+
let json_str = read_to_string(in_file)?;
24+
let popularities: Popularities = serde_json::from_str(&json_str)?;
25+
26+
let mut all_indices: HashMap<Locale, Vec<(&Page, f64)>> = HashMap::new();
27+
28+
for doc in docs {
29+
let entry = all_indices.entry(doc.locale()).or_default();
30+
entry.push((
31+
doc,
32+
popularities
33+
.popularities
34+
.get(doc.url())
35+
.cloned()
36+
.unwrap_or_default(),
37+
));
38+
}
39+
40+
for (locale, mut index) in all_indices.into_iter() {
41+
if !index.is_empty() {
42+
index.sort_by(|(da, a), (db, b)| match b.partial_cmp(a) {
43+
None | Some(Ordering::Equal) => da.title().cmp(db.title()),
44+
Some(ord) => ord,
45+
});
46+
let out = index
47+
.into_iter()
48+
.map(|(doc, _)| SearchItem {
49+
title: doc.title(),
50+
url: doc.url(),
51+
})
52+
.collect::<Vec<_>>();
53+
let out_file = build_out_root()?
54+
.join(locale.as_folder_str())
55+
.join("search-index.json");
56+
let file = File::create(out_file)?;
57+
let buffed = BufWriter::new(file);
58+
59+
serde_json::to_writer(buffed, &out)?;
60+
}
61+
}
62+
Ok(())
63+
}

Diff for: src/main.rs

+8
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use rari_doc::build::{
1414
use rari_doc::cached_readers::{read_and_cache_doc_pages, CACHED_DOC_PAGE_FILES};
1515
use rari_doc::pages::types::doc::Doc;
1616
use rari_doc::reader::read_docs_parallel;
17+
use rari_doc::search_index::build_search_index;
1718
use rari_doc::utils::TEMPL_RECORDER_SENDER;
1819
use rari_tools::history::gather_history;
1920
use rari_tools::popularities::update_popularities;
@@ -70,6 +71,8 @@ struct BuildArgs {
7071
#[arg(long)]
7172
skip_contributors: bool,
7273
#[arg(long)]
74+
skip_search_index: bool,
75+
#[arg(long)]
7376
skip_blog: bool,
7477
#[arg(long)]
7578
skip_curriculum: bool,
@@ -189,6 +192,11 @@ fn main() -> Result<(), anyhow::Error> {
189192
urls.extend(build_docs(&docs)?);
190193
println!("Took: {: >10.3?} to build content", start.elapsed());
191194
}
195+
if !args.skip_search_index && args.files.is_empty() {
196+
let start = std::time::Instant::now();
197+
build_search_index(&docs)?;
198+
println!("Took: {: >10.3?} to build search index", start.elapsed());
199+
}
192200
if !args.skip_curriculum && args.files.is_empty() {
193201
let start = std::time::Instant::now();
194202
urls.extend(build_curriculum_pages()?);

0 commit comments

Comments
 (0)