Documentation Site on GitHub Pages (#2376)

* Add initial documentations

* Update documentation for Basic Client and add WebSocket section

* feat: add a static site generator with multi-language support

- Introduced a new Rust-based static site generator in the `docs-gen` directory.
- Implemented core functionality for building sites from markdown files, including:
  - Configuration loading from `config.toml`.
  - Markdown rendering with frontmatter support.
  - Navigation generation based on page structure.
  - Static file copying and output directory management.
- Added templates for base layout, pages, and portal.
- Created a CSS file for styling and a JavaScript file for interactive features like language selection and theme toggling.
- Updated documentation source with new configuration and example pages in English and Japanese.
- Added a `justfile` target for building the documentation site.

* Add language/theme toggle functionality

- Created a new Japanese tour index page at docs/ja/tour/index.html
- Implemented navigation links for various sections of the cpp-httplib tutorial
- Added a language selector to switch between English and Japanese
- Introduced theme toggle functionality to switch between light and dark modes
- Added mobile sidebar toggle for better navigation on smaller screens
This commit is contained in:
yhirose
2026-02-28 14:45:40 -05:00
committed by GitHub
parent 85b18a9c64
commit 797758a742
66 changed files with 12361 additions and 0 deletions

53
docs-gen/src/config.rs Normal file
View File

@@ -0,0 +1,53 @@
use anyhow::{Context, Result};
use serde::Deserialize;
use std::path::Path;
#[derive(Debug, Deserialize)]
pub struct SiteConfig {
pub site: Site,
pub i18n: I18n,
pub highlight: Option<Highlight>,
}
#[derive(Debug, Deserialize)]
pub struct Site {
pub title: String,
pub version: Option<String>,
pub base_url: String,
}
#[derive(Debug, Deserialize)]
pub struct I18n {
pub default_lang: String,
pub langs: Vec<String>,
}
#[derive(Debug, Deserialize)]
pub struct Highlight {
pub theme: Option<String>,
pub theme_light: Option<String>,
}
impl SiteConfig {
pub fn load(src_dir: &Path) -> Result<Self> {
let path = src_dir.join("config.toml");
let content =
std::fs::read_to_string(&path).with_context(|| format!("Failed to read {}", path.display()))?;
let config: SiteConfig =
toml::from_str(&content).with_context(|| format!("Failed to parse {}", path.display()))?;
Ok(config)
}
pub fn highlight_theme(&self) -> &str {
self.highlight
.as_ref()
.and_then(|h| h.theme.as_deref())
.unwrap_or("base16-ocean.dark")
}
pub fn highlight_theme_light(&self) -> Option<&str> {
self.highlight
.as_ref()
.and_then(|h| h.theme_light.as_deref())
}
}